二叉樹樹形輸出的幾種方法


二叉樹的輸出,最簡單的方法,就是下面這個:

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)把二叉樹打印到緩衝區

再把緩衝區內容打印到屏幕

最後再清除緩衝區

 

 

 

還有個廣度優先的算法,這裏不說了。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章