c-windows编程 树的画图问题

问题描述

windows编程 树的画图问题

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

解决方案

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!='')//当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");

}


解决方案二:

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

解决方案三:

左小右大,有就加就可

解决方案四:

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

解决方案五:

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

时间: 2024-09-26 08:56:20

c-windows编程 树的画图问题的相关文章

windows画图问题-WINDOWS编程中如何擦除客户区内容?

问题描述 WINDOWS编程中如何擦除客户区内容? 各位前辈你好 最近在学WINDOWS编程,刚学了怎么处理键盘消息和资源这一部分,我导入了一个图标 希望通过按动"->"键来移动图标,我用DrawIcon函数来画这个图标,然后再按动"->" 键,相应的位置又会出现一个相同的图标,但是我之前的图标还在客户区内,我就想每次画图标之前把客户区清空,最好是置为背景颜色,请问用什么函数? 谢谢了 解决方案 你画图放到OnPaint中,同时Invalidate()来

基于.NET平台的Windows编程实战(二) 需求分析与数据库设计

大家都知道一个系统的成败与否关键在于其所做的需求分析是否到位,数据库的设计是否合理.因为本系列文章的目的是在于提高大家对.NET Windows编程的实战能力,故不对需求分析与数据库设计作太多的理论说明,有关这方面的知识请大家自行查阅相关资料,在这里这是简单的罗列一下整个案例系统的功能需求及数据库的设计. 一.需求分析 看过本系列课程前言中案例背景的,应该能大致知道本案例的需求了,我在这里简单的罗列一下吧: 1.系统应该为单机版可安装的软件: 2.系统统计出的数据可随时进行合并,导出-- 3.系

windows自带的画图工具怎么裁剪图片?

  windows自带的画图工具怎么裁剪图片?          1.首先,找到自己要截取的页面,按PrtSc键截取全屏,然后打开电脑的"画图"工具,按Crtl+V粘贴到画图上 2.如图所示,然后点击选择右上角的"裁剪" 3.然后进入裁剪模式,拖动光标,选择你要剪切留下的部分 4.选好后,再次点击"裁剪",就可以剩下所需要的部分了 5.除了上面的的方法,还可以直接右键选择"裁剪",后面的方法同上 6.最后,选择右上角的保存即可

windows编程 在一个窗口上加载一个位图图片

问题描述 windows编程 在一个窗口上加载一个位图图片 希望前辈们能给个demo程序.或者最基本的窗口上加载一个位图图片就好,加载位图时用的LoadImage 初学windows编程,不太懂上下文设备,希望大神能给个例程,让我学习. 解决方案 c++windows编程加载图片 解决方案二: #include #include "resource.h" LRESULT CALLBACK WndProc1(HWND hwnd,UINT message,WPARAM wParam,LPA

windows编程怎样屏蔽任务管理器

问题描述 windows编程怎样屏蔽任务管理器 windows编程怎样屏蔽Ctrl+alt+delete?有个函数只对XP有效,有没有对win7有效的? 解决方案 底层键盘钩子hook 解决方案二: 参考How to Disable/Enable Task Manager 虽然是英文的,但是都是截图,按照操作,应该没有问题. 除了Ctrl+Alt+Delete外,Ctrl+Shift+Esc也可以打开任务管理器的,不知道上面的方法是否也会屏蔽这样的操作,你设好之后可以测试一下. 解决方案三: 用

windows编程中为滚动条写了按键的代码,但是按了相应的键不起作用。

问题描述 windows编程中为滚动条写了按键的代码,但是按了相应的键不起作用. 代码如下: case WM_KEYDOWN: switch (message) { case VK_HOME: SendMessage(hwnd, SB_VERT, SB_TOP, 0L); case VK_END: SendMessage(hwnd, SB_VERT, SB_BOTTOM, 0L); break; case VK_PRIOR: SendMessage(hwnd, SB_VERT, SB_PAGEU

windows编程-windows的API中有没有能够更改文件名字的函数?菜鸟求助!!!

问题描述 windows的API中有没有能够更改文件名字的函数?菜鸟求助!!! 有的话请高手说明一下用法.没有的话请高手介绍一下在windows编程中(我用的是c++)怎样实现更改一个文件的名字?谢谢了 解决方案 int rename ( const char * oldname, const char * newname ); 解决方案二: 使用脚本类东西很方便的, 解决方案三: 你可以在windowsAPI函数的外面套一层函数,比如 int 信息框( HWND hWnd,LPCTSTR lp

c++-VC++与VC#的windows编程有区别吗??使用的类库一样吗??

问题描述 VC++与VC#的windows编程有区别吗??使用的类库一样吗?? VC++与VC#的windows编程有区别吗??使用的类库一样吗?? 比如这个里面的一些框架函数如Button等的使用相同吗? 解决方案 微软为C++做了一些扩展,搞出一种向下兼容C++,但是又有自己的语法以兼容.net的语言,叫C++/CLI(以前叫C++ ME,托管扩展) VC++/CLI可以同时支持MFC和.NET.但是事实上几乎没有人用,是很冷僻的技术. 相比较MFC,WinForms和WPF要好太多,C#也

设备上下文-请问各位大神,Windows编程里边的DC(device context)到底是什么啊?

问题描述 请问各位大神,Windows编程里边的DC(device context)到底是什么啊? 请教各位大神,设备上下文(device context)到底是个什么东西?它仅仅是一个抽象概念还是一个实体概念(即有对应的代码)?它是一个结构体吗?如果它有对应的源码的话,怎么能找到?在下在网上找了很多资料,包括MSDN上的,但越看越糊涂.在下想了解关于它最本质的东西,在下怎么才能"看到它"?这个问题给在下带来很大困惑,希望大家为在下指点迷津,拜托大家了!在下先行谢过! 解决方案 DC实