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