1. 程式人生 > 實用技巧 >層次遍歷二叉樹

層次遍歷二叉樹

107. 二叉樹的層次遍歷 II

難度簡單

給定一個二叉樹,返回其節點值自底向上的層次遍歷。 (即按從葉子節點所在層到根節點所在的層,逐層從左向右遍歷)

例如:
給定二叉樹[3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其自底向上的層次遍歷為:

[
  [15,7],
  [9,20],
  [3]
]
通過次數88,133 提交次數131,201 做題思路: 1.先將每一層壓入佇列 2.利用上一層節點的個數,來將當前的各個節點push到佇列中。利用上一層將下一層壓入佇列時,同時列印上一層的節點的值,並將上一層的節點pop出去。

方法一:廣度優先搜尋
樹的層次遍歷可以使用廣度優先搜尋實現。從根節點開始搜尋,每次遍歷同一層的全部節點,使用一個列表儲存該層的節點值。

如果要求從上到下輸出每一層的節點值,做法是很直觀的,在遍歷完一層節點之後,將儲存該層節點值的列表新增到結果列表的尾部。這道題要求從下到上輸出每一層的節點值,只要對上述操作稍作修改即可:在遍歷完一層節點之後,將儲存該層節點值的列表新增到結果列表的頭部。

為了降低在結果列表的頭部新增一層節點值的列表的時間複雜度,結果列表可以使用連結串列的結構,在連結串列頭部新增一層節點值的列表的時間複雜度是 O(1)O(1)。在 Java 中,由於我們需要返回的 List 是一個介面,這裡可以使用連結串列實現;而 C++ 或 Python 中,我們需要返回一個 vector 或 list,它不方便在頭部插入元素(會增加時間開銷),所以我們可以先用尾部插入的方法得到從上到下的層次遍歷列表,然後再進行反轉。

複雜度分析

時間複雜度:O(n)O(n),其中 nn 是二叉樹中的節點個數。每個節點訪問一次,結果列表使用連結串列的結構時,在結果列表頭部新增一層節點值的列表的時間複雜度是 O(1)O(1),因此總時間複雜度是 O(n)O(n)。

空間複雜度:O(n)O(n),其中 nn 是二叉樹中的節點個數。空間複雜度取決於佇列開銷,佇列中的節點個數不會超過 nn。

作者:LeetCode-Solution
連結:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/solution/er-cha-shu-de-ceng-ci-bian-li-ii-by-leetcode-solut/

來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。