二叉樹的層次遍歷

2022-08-24 13:36:09 字數 1352 閱讀 3284

如何遍歷一棵樹

有兩種通用的遍歷樹的策略:

深度優先搜尋(dfs)

在這個策略中,我們採用深度作為優先順序,以便從跟開始一直到達某個確定的葉子,然後再返回根到達另乙個分支。

深度優先搜尋策略又可以根據根節點、左孩子和右孩子的相對順序被細分為先序遍歷,中序遍歷和後序遍歷。

寬度優先搜尋(bfs)

我們按照高度順序一層一層的訪問整棵樹,高層次的節點將會比低層次的節點先被訪問到。

下圖中的頂點按照訪問的順序編號,按照 1-2-3-4-5 的順序來比較不同的策略。

本問題就是用寬度優先搜尋遍歷來劃分層次:[[1], [2, 3], [4, 5]]。

方法 1:遞迴

演算法最簡單的解法就是遞迴,首先確認樹非空,然後呼叫遞迴函式 helper(node, level),引數是當前節點和節點的層次。程式過程如下:

輸出列表稱為 levels,當前最高層數就是列表的長度 len(levels)。比較訪問節點所在的層次 level 和當前最高層次 len(levels) 的大小,如果前者更大就向 levels 新增乙個空列表。

將當前節點插入到對應層的列表 levels[level] 中。

遞迴非空的孩子節點:helper(node.left / node.right, level + 1)。

實現

class

solution

public list>levelorder(treenode root)

}

複雜度分析

時間複雜度:o(n)o(n),因為每個節點恰好會被運算一次。

空間複雜度:o(n)o(n),儲存輸出結果的陣列包含 n 個節點的值。

方法 2:迭代

演算法上面的遞迴方法也可以寫成迭代的形式。

第 0 層只包含根節點 root ,演算法實現如下:

初始化佇列只包含乙個節點 root 和層次編號 0 : level = 0。

當佇列非空的時候:

在輸出結果 levels 中插入乙個空列表,開始當前層的演算法。

計算當前層有多少個元素:等於佇列的長度。

將這些元素從佇列中彈出,並加入 levels 當前層的空列表中。

將他們的孩子節點作為下一層壓入佇列中。

進入下一層 level++。

實現

class

solution

//go to next level

level++;

}return

levels;

}}

層次遍歷二叉樹

問題 假定根節點位於第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...