控制台的二叉树树形显示

本文介绍了如何在控制台上显示带有左右向斜线的二叉树树形结构,通过递归方式建立二维矩阵实现,参考了相关文章进行改进。

        在文章《求二叉树的高度以及二叉树的树形显示》中,显示的结点的下一行的左右没有标示左右子树的左右向斜线,下面参考了零一篇文章添加了左右向斜线的显示。显示的代码如下:

void PrintTree(BinTree T,int root_x,int root_y,int step,char **Marker)
{
	int lChildPos,rChildPos;
	lChildPos = root_x - step;
	rChildPos = root_x + step;
	if (!T) 
		return;
	else
	{
		Marker[root_y][root_x] = T->data;
		if (T->lChild) 
			Marker[root_y+1][root_x-1] = '/';
		if (T->rChild)
			Marker[root_y+1][root_x+1] = '\\';
		PrintTree(T->lChild,lChildPos,root_y+2,step>>1,Marker);
		PrintTree(T->rChild,rChildPos,root_y+2,step>>1,Marker);
	}
} 

递归方式建立上文的二维矩阵m(文章《求二叉树的高度以及二叉树的树形显示》中ShowTreeMarker(int **m,int row,int col,char *s)函数的参数m,即占位标识矩阵):

void MakeMat(BinTree T,int root_x,int root_y,int step,int **m)
{
	int lChildPos,rChildPos;
	lChildPos = root_x - step;
	rChildPos = root_x + step;
	if (!T) 
		return;
	else
	{
		m[root_y][root_x] = 1;
		MakeMat(T->lChild,lChildPos,root_y+1,step>>1,m);
		MakeMat(T->rChild,rChildPos,root_y+1,step>>1,m);
	}
}
调用方式:

MakeMat(T,len>>1,0,len+1>>2,m);

在二维矩阵Marker传参前,对Marker进行初始化为空白字符:

	int h = Height(T);
	int len = (1<<h) - 1;
        char **Marker = new char*[2*h-1];
	for(int i=0;i<2*h-1;i++){
		Marker[i] = new char[len];
		memset(Marker[i],32,len*sizeof(char));
		/*for(int j=0;j<len;j++)
			Marker[i][j] = ' ';*/
	}
	PrintTree(T,len>>1,0,(len+1)>>2,Marker);
	for(int i=0;i<2*h-1;i++)
	{
		for(int j=0;j<len;j++)
		{
			cout<<Marker[i][j];
		}
		cout<<endl;
	} 
	for(int i=0;i<2*h-1;i++){
		delete [] Marker[i];
	}
	delete [] Marker;

效果:

   A   
  / \  
 B   C 
/ \ /  
D E F  
               A               
              / \              
       B               C       
        \             / \      
           D       E       F   
                          / \  
                         G   H 
                        /      
                        I      
额,感觉还是用Matlab绘制的图好点。

REF:

1,http://blog.csdn.net/ditian1027/article/details/19982683



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值