绘制树结构
来源:互联网 发布:淘宝一千零一夜 在哪 编辑:程序博客网 时间:2024/06/16 06:13
树的表示方法有双亲表示法、孩子表示法、双亲孩子表示法、孩子兄弟表示法,具体请参考http://blog.csdn.net/xiazdong/article/details/7296257。其中前三种基于数组,最后一种基于链表。我定义的数节点数据结构为
typedef struct _TREENODE {char val;_TREENODE* Parent;_TREENODE* Child;_TREENODE* Sibling;}TREENODE, *PTREENODE;也就是孩子兄弟表示法,附加一个指向父节点的指针。
我想在界面上绘制这棵树,想了很多种树的表现形式,觉得难以实现。由于我的这棵树是创建磁盘快照产生的,于是我参考了vmware中快照的展示,如下:
参考上图,发现第一个子快照和父快照处于同一横向水平线上,而兄弟节点处于竖向垂直线上。并且每一个子节点在其前一个兄弟节点绘制完毕后才绘制,所以其所在垂直方向的深度为其前一个兄弟节点(包括这个兄弟节点的子节点)锁绘制的最大深度加1。根据上图,可以给每一个快照点一个坐标方便绘制,例如Debug Mode的坐标为(2,0),而Debug Adv的坐标为(3,2)。于是我又在之前树结点定义加入了坐标值:
typedef struct _TREENODE {char val;int i;int j;_TREENODE* Parent;_TREENODE* Child;_TREENODE* Sibling;}TREENODE, *PTREENODE;初始化根节点坐标值为(0,0),而后在遍历树的过程中确定每个结点的坐标,并绘制(输出)树结点,以下为完整的代码
// PrintTree.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <Windows.h>using namespace std;typedef struct _TREENODE {char val;int i;int j;_TREENODE* Parent;_TREENODE* Child;_TREENODE* Sibling;}TREENODE, *PTREENODE;PTREENODE AddNode(PTREENODE p, char val){PTREENODE pn = new TREENODE;pn->val = val;pn->Child = pn->Sibling = NULL;pn->Parent = p;if (p->Child == NULL){p->Child = pn;}else{p = p->Child;while (p->Sibling != NULL){p = p->Sibling;}p->Sibling = pn;}return pn;}int Print(PTREENODE p){if (p == NULL)return 0;int depth = p->j;cout<<p->val<<"("<<p->i<<","<<p->j<<")"<<endl;//遍历子节点if (p->Child){p->Child->i = p->i + 1;p->Child->j = p->j;depth = Print(p->Child);}//打印兄弟节点if(p->Sibling){depth++;p->Sibling->j = depth;p->Sibling->i = p->i;depth = Print(p->Sibling);}return depth;}int _tmain(int argc, _TCHAR* argv[]){TREENODE root;ZeroMemory(&root, sizeof(root));root.val = 'A';PTREENODE pB = AddNode(&root, 'B');PTREENODE pC = AddNode(&root, 'C');PTREENODE pD = AddNode(&root, 'D');PTREENODE pE = AddNode(pB, 'E');PTREENODE pF = AddNode(pB, 'F');PTREENODE pG = AddNode(pB, 'G');PTREENODE pH = AddNode(pC, 'H');PTREENODE pI = AddNode(pD, 'I');PTREENODE pJ = AddNode(pD, 'J');PTREENODE pK = AddNode(pG, 'K');Print(&root);return 0;}
0 0
- 绘制树结构
- WINFORM树结构的绘制和数据表结构的绘制。
- WinForm 树结构的绘制与数据表的映射
- 代数结构 笔记, graphviz绘制
- DNA结构该如何绘制
- 网络模型结构的绘制
- cxGrid源代码结构分析Ⅰ(视图绘制)
- 并行绘制框架Equalizer的系统结构
- 井身结构示意图绘制(WPF)
- Caffe学习:使用pycaffe绘制网络结构
- 结构化图形绘制利器Graphviz
- 三维结构模型DXF文件绘制技巧
- 网络拓扑结构的绘制(三)
- 怎么用ChemDraw绘制动物细胞结构
- ChemDraw 15.1 Pro怎么绘制彩色结构
- draw_net.py绘制caffe net结构
- caffe使用draw_net.py网络结构绘制
- Caffe: 用Python绘制网络结构
- 如何制作表格(三)——GridView + RecyclerView.GridLayoutManager
- 深入理解Servlet/JSP之“Cookie和Session原理”
- Visual Studio中如何统计怎个项目的代码行数
- 完美数的完整程序源码
- 通用网页广告监测,ADBlock plus算法的C#实现。
- 绘制树结构
- 策略模式
- MP4文件格式的解析,以及MP4文件的分割算法
- VDBENCH 试用
- Altium Designer16 精心总结
- centos 安装python PIL模块
- qt正则表达式
- angularjs列表数据是否渲染完毕
- 剑指offer--面试题62:序列化二叉树