2 qq 22210253 qq_22210253 于 2016.02.04 17:55 提问

windows编程 树的画图问题

我的B-树是使用链表作为存储结构的,在绘制B-树的图像的时候,如何确定结点在画布上的位置?我想的是利用树的遍历操作,每遍历一个结点就画出这个结点的图像,但是这个结点的位置怎么确定?图片说明
今天想了好久,希望大神帮忙看一下,谢谢!

5个回答

qq_28410301
qq_28410301   2016.02.06 14:58
已采纳

http://download.csdn.net/detail/qq_28410301/9275927

看这个 全写里面了。
我可以给你大概讲讲,首先你向右边遍历,在遍历的函数中添加一个额外的int类型的参数a,当你在遍历的过程中,一直让这个数值a=a+3,加多少你自己订就好,不多说了,直接看代码,不会的看上面的链接,里面有详细的说明文档和想法。

#include
#include "binaryTreeNode.h"
#include
#include
#include
using namespace std;

bool isOperator (char a)//判断是否为操作符
{
if(a=='+'||a=='-'||a=='*'||a=='/'||a=='('||a==')')
return true;
return false;
}

string inToPost (string s)//中序转后序
{
char temp;
string post="";
stack h;//运算符进栈

for(int i=0;i<s.size();i++)
{
    temp=s[i];
    //cout<<"S[i] :"<<s[i]<<endl;

    if(isOperator(temp))   //是操作符 分两种情况 h为空和不空
    {
        //cout<<"ff"<<endl;
        if(h.empty()) //h为空
        {
            //cout<<"kk"<<endl;
            h.push(temp);
            continue;
        }
        else     //h不为空
        {
            if(temp=='(')
            {
                h.push(temp);
                continue;
            }
            if(temp==')')
            {
                while((!h.empty()) && h.top()!='(' )
                {
                    post+=h.top();
                    h.pop();
                }
                h.pop();
                continue;               
            }
            if(temp=='+'||temp=='-')
            {
                //cout<<"Operator :"<<temp<<endl;
                //cout<<"tt"<<endl;
                while((!h.empty()) && h.top()!='(' )
                {
                    //cout<<h.top()<<endl;
                    post+=h.top();
                    //cout<<post<<endl;
                    h.pop();
                    //bool r=h.empty();
                    //cout<<r<<endl;
                    //cout<<"pp"<<endl;
                }
                h.push(temp);
                continue;
            }
            if(temp=='*'||temp=='/')
            {
                while((h.top()=='*' || h.top()=='/') && (!h.empty()) )
                {
                    post+=h.top();
                    h.pop();
                }
                h.push(temp);
                continue;
            }
        }
    }
    else//不是操作符 是数字
        post+=s[i];

}

for(;!h.empty();)
{
    post+=h.top();
    h.pop();
}

return post;

}

void postToBinary (binaryTreeNode* &tree,string s)//后序转二叉树
{
char temp;
int i=0;
temp=s[i];

stack<binaryTreeNode*> k;//存几个有用的节点 (就是还没有相关联的节点)

while(temp!='\0')//当s没有扫到右边尾部时
{
    tree = new binaryTreeNode(temp);

    if(!isOperator(temp))//直接是数字 不是字符的情况
    {
        k.push(tree);
        temp=s[i++];
    }
    else//为字符的情况
    {
        if(!k.empty())
        {
            tree->rightChild=k.top();
            k.pop();
        }
        if(!k.empty())
        {
            tree->leftChild=k.top();
            k.pop();
        }
        k.push(tree);
        temp=s[i++];
    }
}

}

//ofstream ofs("target.txt", ios::out);

ofstream out ("a.txt",ios::out);

void outPutTree (binaryTreeNode* tree,int theDistance)
{
if(tree)//树不为空
{
outPutTree (tree->rightChild, theDistance+3);
for(int i=0; i out cout coutelement < outelement < for(int j=0;j out cout outPutTree (tree->leftChild , theDistance+3);
}
}

void freeTree(binaryTreeNode* & tree)//释放树
{
if(tree->leftChild!=NULL)
freeTree(tree->leftChild);
if(tree->rightChild!=NULL)
freeTree(tree->rightChild);
delete(tree);
}

void main ()
{
string s;
cin>>s;
binaryTreeNode* tree;

s=inToPost(s);

postToBinary(tree,s);

outPutTree(tree,0);

freeTree(tree);
system("pause");

}


qq_22210253
qq_22210253 谢谢这么详细的回答!你说的很对,变着法的遍历就行了,一次遍历解决不了任何问题
2 年多之前 回复
devmiao
devmiao   Ds   Rxr 2016.02.04 21:44

位置可以先排列好最后一排,再算出上一层,以此类推!

xyz347
xyz347   2016.02.04 18:53

先获取树的深度n,那么叶子节点最多有2^n个,假设每个节点画出来的框框大小为1,那么需要的长度就是2^n。根节点y坐标是0,x是2^(n-1),每往下一层y加1,左孩子是左边的一半,右孩子是右边的一半,依次类推

qq_22210253
qq_22210253 不好意思我一开始上传的图片不好,不是二叉树
2 年多之前 回复
paopaoTT
paopaoTT   2016.02.04 19:13

左小右大,有就加就可

qq_28410301
qq_28410301   2016.02.06 15:01

上面的 你有不会的再问吧 二叉树的问题挺有趣的 只要变着方法遍历就可以了 楼主觉得可以望采纳.....

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
三. 简单绘图--Windows编程课程学习笔记
三. 简单绘图--Windows编程课程学习笔记
windows编程之绘图DC
windows中利用GDI画图就得使用DC --Device Context。这里主要讲讲windows的重绘,当需要绘制时候,必会产生WM_PAINT的消息。 (1)WM_PAINT产生的条件为: 在使用者移动窗口或显示窗口时,窗口中先前被隐藏的区域重新可见。  使用者改变窗口的大小(如果窗口类别样式有着CS_HREDRAW和CS_VREDRAW位旗标的设定)。  程序使用ScrollW
windows程序设计(6):基本画图
windows程序画图,大体上有3种方法: (1)你告诉系统点的坐标和颜色,系统通过SetPixel来画。类似的,通过GetPixel来获取某一点像素值。 (2)使用MoveToEx、LineTo来划线,MoveToEx设置起点坐标,LineTo设置终点坐标,或者使用Polyline函数,这个函数接受一个POINT类型的数组,通过数组里的点连线。 (3)windows提供了一些基本图形绘制的
回溯法子集树与排列树
当所给问题是从n个元素的集合S中找出满足某种性质的子集时,解空间为子集树。     当所给问题是从n个元素的集合S中找出满足某种性质的排列时,解空间为排列树。         回溯法搜索子集树算法描述为:      void backtrack(int  t)     {        if(t>n)   output(x);        else           fo
windows程序设计绘图模式及映射模式
在windows程序设计中,GDI是很重要的一部分,gdi
windows基础编程----第四篇(调用GDI绘制出相关图形)
这一篇我们来画图吧~相信大家对图像的绘制也是会感兴趣点。
Window画图程序中画曲线的简单实现
 Window画图程序中画曲线的简单实现下面是很入以前的一个程序,模仿Windows的画图程序中画曲线.其实原理简单得要命 ,就是一个PolyBezier函数.那一位有兴趣的可以封装成一个类,方便以后用.unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls
Windows界面编程第五篇 静态控件背景透明化
上一篇《Windows界面编程第三篇 异形窗体 普通版》和《Windows界面编程第四篇异形窗体 高富帅版》介绍了异形窗口(异形窗体)的创建,并总结出了异形窗口的“三要素”:1.WS_EX_LAYERED属性2.指定透明色3.以位图为窗口背景     本篇文章将主要介绍Windows编程中如何实现静态控件背景的透明化,这将进一步的美化界面。下面先看一张没有做静态控件背景透明化的对话框程序的运行画面
《Windows程序设计》读书笔五 绘图基础
Windows在基于图形设备接口的视频显示器和打印机上显示图像。GDI 5.1.1 GDI原理 GDI是为了兼容于设备无关的图形。 图形输出设备分为两大类,光栅设备和矢量设备。GDI是图形设备硬件的一种高级接口。 GDI总的来说是一个静态系统,对动画支持有限。如果需要为游戏编写复杂的动画,还是需要使用DirectX 或者OpenGL 5.1.2 GDI函数使用 GDI函数的分类
windows编程之位图
前言:本来今天想学着在VC++里插入图片的,结果这一弄就弄了一下午,终于有一点会了。这这是是一次艰难的学习经历。我看的是一本比较就的书《Visual C++ 面向对象与可视化程序设计》(第2版),下午刚开始照着书上的例子写代码的,结果,呜呜呜,貌似根本就不管用。书上插入位图用的是LoadBitmap()。当时我就郁闷了,到网上找资料,相关方面的资料也不是很多,要么就是MFC的,要么就是比较高深的图