二叉樹的輸出,最簡單的方法,就是下面這個:
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)把二叉樹打印到緩衝區
再把緩衝區內容打印到屏幕
最後再清除緩衝區
還有個廣度優先的算法,這裏不說了。