二叉树树形输出的几种方法


二叉树的输出,最简单的方法,就是下面这个:

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); //把当前结点的元素值打印在第hm

//在这里可以根据有无左右子树画些小箭头

return puttree(t->right,h+1,m+1);

}

}

 

调用puttree(t,0,0)把二叉树打印到缓冲区

再把缓冲区内容打印到屏幕

最后再清除缓冲区

 

 

 

还有个广度优先的算法,这里不说了。

 

posted @ 2016-03-19 21:44  w43076  阅读(1189)  评论(0编辑  收藏  举报