绘制树结构

树的表示方法有双亲表示法、孩子表示法、双亲孩子表示法、孩子兄弟表示法,具体请参考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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值