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

LeetCode 889: Construct Binary Tree from Preorder and Postorder Traversal

·1 分鐘· ·
LeetCode Medium Array Hash-Table Divide-and-Conquer Tree Binary-Tree
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2026-10-29

  • 提交紀錄:Accepted(一次通過)

解題思路
#

前序是「根、左、右」,後序是「左、右、根」。一個節點出現在後序裡,代表它的整棵子樹已經結束。

依序讀前序(Tree 模板九):

  • stack 存「目前這條從根往下的路徑」上、子樹還沒結束的節點。
  • 讀到新節點前,先看堆頂是不是後序指標指到的值:是的話,這棵子樹已經完整,pop 掉,後序指標往前,一直重複。
  • 新節點是堆頂的小孩:堆頂還沒有左小孩就接左邊,否則接右邊,然後推進 stack。

只有一個小孩的節點,前序加後序分不出是左還是右,題目接受任何一種答案,這個寫法一律接在左邊。

我的嘗試
#

一次通過。

正確解法
#

class Solution:
    def constructFromPrePost(self, preorder: List[int], postorder: List[int]) -> Optional[TreeNode]:
        root = TreeNode(preorder[0])
        stack = [root]
        j = 0
        for val in preorder[1:]:
            node = TreeNode(val)
            while stack[-1].val == postorder[j]:
                stack.pop()
                j += 1
            if not stack[-1].left:
                stack[-1].left = node
            else:
                stack[-1].right = node
            stack.append(node)
        return root

遞迴的做法:preorder[1] 是左子樹的根,在後序裡找到它的位置,就知道左子樹的大小,再切開兩邊遞迴。用雜湊表記後序位置的話也是 O(n)。

複雜度
#

時間 O(n):每個節點進出 stack 各一次。空間 O(h)。

要特別避免的錯誤
#

  • pop 要在接上新節點之前做,用 while,可能一次結束好幾層子樹。
  • 答案不唯一,不用特別處理只有一個小孩的情況。

面試口說整理
#

後序裡出現一個節點,代表它的子樹結束了。我依序讀前序,用 stack 存還沒結束的路徑;每讀一個新節點,先把堆頂等於後序目前值的節點 pop 掉,再把新節點接到堆頂,沒有左小孩就接左邊,否則接右邊。每個節點進出 stack 一次,時間 O(n)。

相關文章

LeetCode 106: Construct Binary Tree from Inorder and Postorder Traversal
·1 分鐘
LeetCode Medium Array Hash-Table Divide-and-Conquer Tree
LeetCode 106 解題筆記:後序的最後一個是根;從後序尾巴往前取根時,要先建右子樹再建左子樹
LeetCode 105: Construct Binary Tree from Preorder and Inorder Traversal
·2 分鐘
LeetCode Medium Array Hash-Table Divide-and-Conquer Tree
LeetCode 105 解題筆記:前序的第一個是根,在中序裡找到根的位置就知道左子樹有幾個節點;用字典查位置,O(n)
LeetCode 863: All Nodes Distance K in Binary Tree
·1 分鐘
LeetCode Medium Hash-Table Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 863 解題筆記:先把樹轉成無向圖(補上往父節點的邊),再從 target BFS 走 k 步
LeetCode 652: Find Duplicate Subtrees
·1 分鐘
LeetCode Medium Hash-Table Tree Depth-First-Search Binary-Tree
LeetCode 652 解題筆記:後序把每棵子樹編碼,出現第二次時加入答案;字串編碼最差 O(n^2),改成 (值, 左 id, 右 id) 編號可到 O(n)
LeetCode 314: Binary Tree Vertical Order Traversal
·1 分鐘
LeetCode Medium Hash-Table Tree Depth-First-Search Breadth-First-Search Sorting Binary-Tree
LeetCode 314 解題筆記:BFS 帶著欄位編號,用 BFS 才能保證同一欄由上到下、同一列由左到右
LeetCode 347: Top K Frequent Elements
·1 分鐘
LeetCode Medium Array Hash-Table Divide-and-Conquer Sorting
LeetCode 347 解題筆記:先計數,再用大小為 k 的 heap 或 bucket sort(次數當 index)取出次數最多的 k 個