3 10分層遍歷二叉樹 擴充套件問題

2021-06-20 19:29:52 字數 1535 閱讀 1121

給定一棵二叉樹,要求按分層遍歷該二叉樹,即從上到下按層次訪問該二叉樹(每一層將單獨輸出一行),每一層要求訪問的順序為從左到右,並將節點依次編號。 要求遍歷輸出的結果分別為圖2,圖3和圖4,其中圖3和圖4是擴充套件問題。

圖1                                           圖2                               圖3                                     圖4

程式設計之美書上,採用的是容器構成的陣列來實現的,相比於遞迴演算法,時間複雜度大大降低,僅為o(n),但其空間複雜度並非最優。此處採用stl中的queue來解決此問題,**如下:

節點資料:

struct node

;

實現**:

queuequeue3;//------------------使用系統的stl的queue

void cengxu3(node* root)

cout該法中採用佇列,將已輸出的節點彈出,節省了空間開銷,降低了空間複雜度。

對於輸出指定行的節點資料,只需引入乙個變數儲存層數即可,**如下:

queuequeue5;

void cengxu_n_ceng(node *root,int ceng)

if (temp->pleft)

queue5.push(temp->pleft);

if (temp->pright)

queue5.push(temp->pright);

} if (cengshu==ceng)

;queuequeue3;//------------------使用系統的stl的queue

stackqueue3_temp;

stack> queue3_tempfan;

void cengxu3(node* root)

if (temp->pright)

}queue3_tempfan.push(queue3);

queue3_temp.push('\n');

cout

} cout採用先序和中序結果重建二叉樹(**見3.9

),再對其進行遍歷的測試結果如圖5所示,前四行分別為先序、中序、後序和層序遍歷結果,後面3個三角形分別對應圖2、圖3、圖4中的結果。

圖5

程式設計之美 3 10 分層遍歷二叉樹

1 2 3 4 5 6 7 8 運用bfs只能輸出1,2,3,4,5,6,7,8這個序列,並不知道分層資訊,因此如何分層列印呢?我的方法就是對每乙個節點做以下判斷,如果該節點在佇列中的下乙個節點是是null說明該節點是樹在某一層的最後乙個節點,將該節點的子節點輸入佇列中之後,在輸入乙個null節點。...

程式設計之美 3 10 分層遍歷二叉樹

看到這本書就有一種高大上的感覺,隨手翻翻,今天又搞一道!首先,看到問題1我首先想到了圖的廣度優先搜尋遍歷演算法,後來一查書 資料結構高分筆記 才想起來樹本來就有一種遍歷方式叫 層次遍歷 p110 也就問題1中想要列印樹的方式。利用了資料結構 迴圈佇列 作為輔助的工具。其實自己想的時候也想到了用佇列的...

程式設計之美讀書筆記 3 10 分層遍歷二叉樹

3.10 分層遍歷二叉樹 看到milo寫的這篇文章 又翻了下書,發現書的 p253 有個瑕疵,每個節點值後面都會顯示乙個空格,如果將間隔字元改為 輸出的每行最後都有乙個 不能達到要求。不過,只要將 cout vec cur data 這行改為 if cur last 1 cout vec cur d...