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

LeetCode 145: Binary Tree Postorder Traversal

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

基本資料
#

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

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

解題思路
#

後序是「左、右、根」,根要等兩個小孩都處理完才記錄(Tree)。在 stack 裡放 (node, visited):

  • 第一次彈出(visited = False):把自己標成 True 放回去,再推右小孩、左小孩(左的後進,會先處理)。
  • 第二次彈出(visited = True):兩個小孩都處理完了,記錄。

我的嘗試
#

空樹時前幾版直接回傳 None;一版把節點本身放進答案而不是值;一版推小孩的順序是先左後右,右邊反而先處理,例如根 9、左 8、右 5:答案 [8, 5, 9],回傳 [5, 8, 9]。

正確解法
#

class Solution:
    def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        res, stack = [], [(root, False)]
        while stack:
            node, visited = stack.pop()
            if not node:
                continue
            if visited:
                res.append(node.val)
            else:
                stack.append((node, True))
                stack.append((node.right, False))
                stack.append((node.left, False))
        return res

複雜度
#

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

要特別避免的錯誤
#

  • 推小孩的順序:先右後左,左邊才會先處理。
  • 回傳的是值,不是節點。

面試口說整理
#

後序要等左右都處理完才記錄根,所以我在 stack 裡放「節點加上是否已經展開過」。第一次彈出時把自己放回去並推右、左小孩,第二次彈出才記錄。時間 O(n)。

相關文章

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 110: Balanced Binary Tree
·1 分鐘
LeetCode Easy Tree Depth-First-Search Binary-Tree
LeetCode 110 解題筆記:每一個節點的左右高度差都不能超過 1;後序回傳高度,不平衡時回傳 -1 一路傳上去
LeetCode 111: Minimum Depth of Binary Tree
·1 分鐘
LeetCode Easy Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 111 解題筆記:最小深度要到葉子才算;只有一邊有小孩時不能拿空的那邊(深度 0)當最小值
LeetCode 112: Path Sum
·1 分鐘
LeetCode Easy Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 112 解題筆記:往下走時把 targetSum 減掉目前的值,到葉子時剛好是 0(或等於葉子的值)就成立
LeetCode 100: Same Tree
·1 分鐘
LeetCode Easy Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 100 解題筆記:兩邊都是空的才相同;一邊空一邊不空就不同;都不空時比值再遞迴比左右