如何遍歷一棵樹
有兩種通用的遍歷樹的策略:
深度優先搜尋(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++。
實現
classsolution
//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...