1. 程式人生 > 實用技巧 >【leetcode-102】二叉樹的層序遍歷

【leetcode-102】二叉樹的層序遍歷

102-二叉樹的層序遍歷

給你一個二叉樹,請你返回其按 層序遍歷 得到的節點值。 (即逐層地,從左到右訪問所有節點)。

題目分析

此題類似於《劍指offer》的第32題

層序遍歷二叉樹是指對二叉樹每一層從左到右進行訪問。

  • 非葉子節點

    對於每一層的非葉子節點,都有兩個子節點。在層序遍歷時,上一層非葉子節點的遍歷順序,和下一層的葉子節點的遍歷順序是相同的。

    因此對於下一層的節點來說,可以在遍歷上一層節點時,使用容器儲存起來。

  • 容器的選擇

    可以觀察到節點的訪問順序與放入容器的順序是相同的,因此可以使用一個棧結構來儲存下層的節點。

  • 每層遍歷開始和結束的判斷

    因為要判斷每一層是否遍歷完,需要一個變數記錄每層的節點數目

  • 將每層按照標準結果輸出

    這道題需要把每層作為一個list新增到result中

實現程式碼



# Definition for a binary tree node.
 # class TreeNode:
 #     def __init__(self, x):
 #         self.val = x
 #         self.left = None
 #         self.right = None
class Solution:
     def levelOrder(self, root: TreeNode) -> List[List[int]]:
         
if not root: return [] res = [] res_val = [] res.append(root) nextLevel = 0 toBeAppended = 1 temp = [] while len(res)>0: node = res.pop(0) temp.append(node.val) ​ # 這裡一定注意要先放左節點再放右節點 if
node.left: res.append(node.left) nextLevel +=1 if node.right: res.append(node.right) nextLevel +=1 #del res[0] toBeAppended -= 1 if toBeAppended == 0: res_val.append(temp) toBeAppended = nextLevel nextLevel = 0 temp = [] return res_val



# 實現方法2
 # 使用容器代替計數
 class Solution:
     def levelOrder(self, root: TreeNode) -> List[List[int]]:
         if not root:
             return []
         res, curnodes = [], [root]
         while curnodes:
             curvals, nextnodes = [], []
             for node in curnodes:
                 curvals.append(node.val)
                 if node.left:
                     nextnodes.append(node.left)
                 if node.right:
                     nextnodes.append(node.right)
                 res.append(curvals)
                 curnodes = nextnodes
         return res