二叉樹層次遍歷的高階

2021-10-04 03:05:40 字數 1830 閱讀 4868

在教科書上學到的關於二叉樹的層次遍歷,只是簡單的按照每一層列印元素。如果想要區分每一層,應該怎麼做?

定義
按照從上到下、從左到右的規則,依次遍歷二叉樹的元素。

二叉樹如下:

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...