在教科書上學到的關於二叉樹的層次遍歷,只是簡單的按照每一層列印元素。如果想要區分每一層,應該怎麼做?定義
按照從上到下、從左到右的規則,依次遍歷二叉樹的元素。
二叉樹如下:
5/ \
7 9
/ \ / \
1 3 2 6
層次遍歷的順序:
5 -> 7 -> 9 -> 1 -> 3 -> 2 -> 6
演算法步驟
初始化乙個佇列,並將根結點置入佇列中;
列印隊首元素值後將其彈出;
將隊首元素的左右子結點分別置入佇列中(如果沒有子結點就跳過);
重複步驟2、3直到隊列為空。
**
#include
#include
using
namespace std;
struct node};
void
bfs(node *root)
}
使用佇列實現層次遍歷的原理是:每pop
出乙個結點,就把這個結點的子結點放入佇列中,直到隊列為空。
上面的**是層次遍歷的乙個正確實現,但是不夠直觀——我們無法得知哪些結點屬於哪一層。那麼怎樣對演算法進行改進,可以正確反映結點的層次呢?
二叉樹如下:
5/ \
7 9
/ \ / \
1 3 2 6
由於要反映各個結點的層次,我們假設返回的結果是:
[[5],
[7, 9],
[1, 3, 2, 6]]
對於這樣乙個"不定長"的二維陣列,行數即是當前結點的層次。
普通的層次遍歷是一輪迴圈中只pop
出乙個結點。如果要將各個層次區分開,我們使用乙個內迴圈,把佇列中的每乙個結點的子結點依次push
進佇列,然後再將父結點pop
。舉個例子:
以上面的二叉樹為例,佇列初始狀態只有根結點3。
第1輪迴圈,此時佇列長度為1,記為current_num,然後內迴圈1次,將3的子結點7和9加入佇列再pop出3;
第2輪迴圈,此時佇列長度為2,記為current_num,然後內迴圈2次,將7和9的子結點1、3、2、6加入佇列再pop出7和9;
第3輪迴圈,此時佇列長度為3,記為current_num,然後內迴圈4次,將1、3、2、6的子結點(也可以沒有)加入佇列再pop出1、3、2、6;
第4輪迴圈,此時隊列為空,結束迴圈。
**#include
#include
using
namespace std;
struct treenode};
vectorint>>
levelorderbottom
(treenode *root)
queue> q;
q.push
(root)
;while
(!q.
empty()
) res.
push_back
(one_level);}
return res;
}
把兩種層次遍歷的方法進行對比來看,普通的層次遍歷就有了兩種方法:第一種就是一次只pop
出乙個結點再將這個結點的子結點加入佇列,第二種就是一次性pop
一層的結點再將每個結點的結點分別加入佇列。 層次遍歷二叉樹
問題 假定根節點位於第0層 1.層次遍歷二叉樹 每層換行分開 2.層次遍歷二叉樹指定的某層 本文 例如 上圖中1.123 4567 82.第三層 78可以看出得出第二問的解,第一問迎刃而解了,所以從問題二下手 1.層次遍歷二叉樹指定的某層 可以得出這樣的乙個結論 遍歷二叉樹的第k層,相當於遍歷二叉樹...
二叉樹層次遍歷
題目描述 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。思路 二叉樹的層次遍歷,利用棧的先進後出的特性。struct treenode class solution res.push back temp while m.empty m中是從左往右入棧,這裡把它反過來,s中是從右往左...
二叉樹層次遍歷
層次遍歷二叉樹,每一次儲存在list中,結果按從葉子層到根,從左到右的順序儲存 一 class solution return lists 相當於在先序的基礎上改進,level是每個node所在的層次。如果lists大小和level相等,說明開始新一層的儲存。如果不等,則直接把值存入相應層次的lis...