↓快轉到主要內容
  1. LeetCode/

LeetCode 589: N-ary Tree Preorder Traversal

·1 分鐘· ·
LeetCode Easy Stack Tree Depth-First-Search
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2022-08-27

  • 提交紀錄:Runtime Error → Accepted ×2 → Runtime Error ×2 → Wrong Answer ×4 → Runtime Error ×2 → Accepted → Runtime Error → Wrong Answer → Accepted ×5 → Runtime Error → Accepted ×4

解題思路
#

前序是先自己、再依序每個小孩(Tree)。迭代版用 stack:彈出就記錄,小孩反著推進去,第一個小孩才會先處理。

我的嘗試
#

這題提交了 24 次,主要是遞迴結果的形狀不對:

  • 寫成 [root.val] + list(map(self.preorder, root.children)),每個小孩的結果是一個 list,被整個放進去,變成巢狀的 [1, [8]],答案是 [1, 8]。
  • 改成只取每個小孩結果的第一個元素 [0],更深的節點就不見了:[8, None, 3, None, 8] 回傳 [8, 3],答案是 [8, 3, 8]。
  • 之後試了很多種攤平的寫法,最後用迴圈 extend 才過。

正確解法
#

class Solution:
    def preorder(self, root: 'Node') -> List[int]:
        res, stack = [], [root] if root else []
        while stack:
            node = stack.pop()
            res.append(node.val)
            stack.extend(reversed(node.children))
        return res

複雜度
#

時間 O(n),空間 O(n)。

要特別避免的錯誤
#

  • 遞迴寫法要把小孩的結果攤平:[root.val] + 每個小孩的結果接起來。
  • 迭代時小孩要反著推進 stack。

面試口說整理
#

前序是先自己再依序每個小孩。我用 stack,彈出就記錄,再把小孩反著推進去,第一個小孩就會先被處理。時間 O(n)。

相關文章

LeetCode 590: N-ary Tree Postorder Traversal
·1 分鐘
LeetCode Easy Stack Tree Depth-First-Search
LeetCode 590 解題筆記:後序是先每個小孩再自己;迭代時可以做「根、小孩由右到左」的前序再整個反轉
LeetCode 145: Binary Tree Postorder Traversal
·1 分鐘
LeetCode Easy Stack Tree Depth-First-Search Binary-Tree
LeetCode 145 解題筆記:迭代的後序遍歷,節點第一次彈出時標記後放回去,再依序推右、左小孩;第二次彈出才記錄
LeetCode 144: Binary Tree Preorder Traversal
·1 分鐘
LeetCode Easy Stack Tree Depth-First-Search Binary-Tree
LeetCode 144 解題筆記:迭代的前序遍歷,彈出就記錄,先推右小孩再推左小孩,左邊才會先處理
LeetCode 94: Binary Tree Inorder Traversal
·1 分鐘
LeetCode Easy Stack Tree Depth-First-Search Binary-Tree
LeetCode 94 解題筆記:迭代的中序遍歷,一路往左把節點推進 stack,彈出時記錄,再轉向右子樹
LeetCode 559: Maximum Depth of N-ary Tree
·1 分鐘
LeetCode Easy Tree Depth-First-Search Breadth-First-Search
LeetCode 559 解題筆記:深度等於 1 加上所有小孩深度的最大值;沒有小孩時是 1
LeetCode 563: Binary Tree Tilt
·1 分鐘
LeetCode Easy Tree Depth-First-Search Binary-Tree Dp-on-Trees
LeetCode 563 解題筆記:後序回傳子樹的總和,每個節點的 tilt 是左右子樹總和的差,加進答案