解題筆記(33) 按層次遍歷二元樹

2021-05-27 19:01:35 字數 1266 閱讀 6313

問題描述:

輸入一顆二元樹,從上往下按層列印樹的每個結點,同一層中按照從左往右的順序列印。

例如輸入

8

/ /6 10

/ / / /

5 7 9 11

輸出8 6 10 5 7 9 11。

定義二元樹(其實是二元搜尋樹,但並不遍歷演算法)的結點為:

view plain

print?

struct

bstreenode    

;    

思路:利用佇列的先進先出,很容易實現。每次取出佇列的首元素,然後將其左右子女放入佇列中。直至隊列為空即可。按這種方式進出佇列,正好是按層遍歷二元樹。

參考**:

//函式功能 : 按層次遍歷二元樹

//函式引數 : proot指向根結點

//返回值 : 無

void levelreverse(bstreenode *proot)

}

擴充套件一:上文給出的**,所有結點都輸出在同一行。如果希望僅僅同層結點輸出在同一行,該如何修改**呢?

思路:如果我們能知道每層的最後乙個結點,那麼就方便多了,輸出每層最後乙個結點的同時,輸出乙個換行符。因此,關鍵在於如何標記每層的結束。可以考慮在每層的最後乙個點之後,插入乙個空結點。比如佇列中先放入根結點,由於第0層只有乙個結點,因此放入乙個空結點。然後依次取出佇列中的結點,將其子女放入佇列中,如果遇到空結點,表明當前層的結點已遍歷完了,而佇列中放的恰恰是下一層的所有結點。如果當前隊列為空,表明下一層無結點,也就說是所有結點已遍歷好了。如果不為空,那麼插入乙個空結點,用於標記下一層的結束。

參考**:

void levelreverse(bstreenode *proot)

else if(nodequeue.size()) //如果結點為空並且佇列也為空,那麼所有結點都已訪問

};void levelreverse(bstreenode *proot)

level++; //層數加1

} for(int i = level - 1; i >= 0; i--) //自下往上遍歷

{ for(int j = pos[i].begin; j < pos[i].end; j++)

coutcout<

二元樹遍歷與常見操作

include include include include include using namespace std struct btree char data btree left,right void preorder btree root else void midorder btree ...

二叉樹按層次遍歷 佇列實現

最近資料結構看的還真是噁心額,腦子不好使,演算法寫不來額 二叉樹一大堆概念性的東西,不過還是寫吧。二叉樹 binary tree 二叉樹的基本形態 二叉樹也是遞迴定義的,其結點有左右子樹之分,邏輯上二叉樹有五種基本形態 1 空二叉樹 a 2 只有乙個根結點的二叉樹 b 3 只有左子樹 c 4 只有右...

按層次順序建立和遍歷二叉樹

第一篇部落格,獻給了資料結構 二叉樹。最近在學資料結構,總結一下二叉樹的按層次建立的方法,希望對此時的你有所幫助 利用順序佇列,層次建立二叉樹 include using namespace std define maxsize 100 struct tnode 樹的資料結構 struct queu...