二叉树树形输出的几种方法
二叉树的输出,最简单的方法,就是下面这个:
void puttree(tree t){
if(t==NULL)return;
else{
puttree(t->left);
printf(“%d ”,t->data);
puttree(t->right);
}
}
以这棵树为例,输出的是1 3 4 6 7 8 10 13 14
这个方法最简单,也最高效,不过你不能看出这棵树的树形。
条形输出
如果想要写一个能看出树形的输出算法,最简单的就是这样:
void puttree(tree t){
if(t==NULL)return;
else{
putchar(‘[‘);
puttree(t->left);
printf(“%d ”,t->data);
puttree(t->right);
putchar(‘]’);
}
}
对于上面那棵树,输出的结果是[[[1] 3 [[4] 6 [7]]] 8 [10 [[13] 14]]]
如果要从上面的输出结果中看出树形,你可能还需要在纸上画一次。
躺着输出
第二个方法,代码是这样:
char bra[]={"-/\\<"};
void puttree(tree t,int h){
int i;
if(t!=NULL){
puttree(t->right,h+1);
for(i=0;i<h;i++)putchar('\t');
printf("%d ",t->data);
putchar(bra[
((NULL!=(t->left))<<1)
|(NULL!=(t->right))
]);
putchar('\n');
puttree(t->left,h+1);
}
}
下面是这个算法的输出结果,这个输出结果是歪的,看的时候可能要歪着头看。
参数h表示的是当前结点的深度,一开始给个0。
这个算法的执行过程:
①输出当前结点的右子树,整棵右子树的深度等于当前结点加1
②输出h个跳格符,深度越大的结点会越往右
③输出当前结点数据
④输出连线,左右子树都有的输出”<”,只有左子树的输出”\”,只有右子树的输出”/”,都没有的输出”-”
⑤换行,再输出左子树
缓冲区输出
第三个方法,是自己定义字符缓冲区,先把树形画到缓冲区上,再把缓冲区的内容写到屏幕
对于排序二叉树,需要申请的字符缓冲区大小至少是高为logn宽为n。
在给出代码之前,我们先看下面的这段代码:
int rputtree(tree t,int n){
int m;
if(t==NULL)return n;
else{
m=rputtree(t->left,n);
printf(“%d %d\n”,m,t->data);
return rputtree(t->right,m+1);
}
}
n一开始代入0,对于上面那棵树,输出结果如下:
很明显,这个函数的作用是二叉树的带秩输出(秩,就是地位、排名的意思)。
缓冲区输出算法要结合躺着输出和带秩输出的原理,用参数h表示深度,n表示秩。
它的代码大致如下:
char area[HEIGHT][WIDTH];
int puttree(tree t,int h,int n){
int m;
if(t==NULL)return n;
else{
m=puttree(t->left,h+1,n);
p(area,t->data,h,m); //把当前结点的元素值打印在第h行m列
//在这里可以根据有无左右子树画些小箭头
return puttree(t->right,h+1,m+1);
}
}
调用puttree(t,0,0)把二叉树打印到缓冲区
再把缓冲区内容打印到屏幕
最后再清除缓冲区
还有个广度优先的算法,这里不说了。