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

LeetCode 449: Serialize and Deserialize BST

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

基本資料
#

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

  • 提交紀錄:Accepted ×3

解題思路
#

和 LC 297 的差別是:這是 BST,所以不需要空節點標記,序列化可以更短。

  • 序列化:前序遍歷,只寫值。
  • 反序列化:前序第一個是根。帶著合法範圍 (low, high) 遞迴(Tree 模板三):下一個值不在範圍內,代表它不屬於這棵子樹,回傳 None 讓祖先去接。左子樹的範圍是 (low, val),右子樹是 (val, high)。

每個值只被讀一次,所以是 O(n)。這和 LC 1008(由前序建 BST)是同一個做法。

我的嘗試
#

三次都一次通過:10-25 先用空白分隔、再改成逗號分隔,10-27 又重寫一次。

第一版的函式取名叫 inorder,但它是先 append 再遞迴,實際上是前序。如果真的用中序,BST 只會得到排序後的序列,所有形狀的 BST 都長一樣,還原不回來。

正確解法
#

class Codec:
    def serialize(self, root: Optional[TreeNode]) -> str:
        res = []

        def preorder(node):
            if not node:
                return
            res.append(str(node.val))
            preorder(node.left)
            preorder(node.right)

        preorder(root)
        return ",".join(res)

    def deserialize(self, data: str) -> Optional[TreeNode]:
        if not data:
            return None
        vals = deque(int(x) for x in data.split(","))

        def build(low, high):
            if not vals or not low < vals[0] < high:
                return None
            val = vals.popleft()
            node = TreeNode(val)
            node.left = build(low, val)
            node.right = build(val, high)
            return node

        return build(-inf, inf)

複雜度
#

兩個方向都是時間 O(n)、空間 O(n)。

要特別避免的錯誤
#

  • 空樹序列化成空字串,"".split(",") 會得到 [""],int("") 會出錯,要先判斷。
  • 序列化要用前序(或後序),不能用中序。
  • 反序列化不要每層切陣列找分界,那樣最差是 O(n^2)。

面試口說整理
#

因為是 BST,我只存前序的值,不需要空節點標記。反序列化時第一個值是根,我帶著上下界遞迴:下一個值不在範圍內就回傳空,讓祖先接手;左子樹的上界是根的值,右子樹的下界是根的值。每個值只讀一次,時間 O(n)。

相關文章

LeetCode 297: Serialize and Deserialize Binary Tree
·1 分鐘
LeetCode Hard String Tree Depth-First-Search Breadth-First-Search Design Binary-Tree
LeetCode 297 解題筆記:前序遍歷加上空節點標記就能唯一還原樹;反序列化用迭代器依序取值
LeetCode 99: Recover Binary Search Tree
·1 分鐘
LeetCode Medium Tree Depth-First-Search Binary-Search-Tree Binary-Tree
LeetCode 99 解題筆記:中序遍歷找逆序:第一次逆序的前一個、最後一次逆序的後一個,就是被交換的兩個節點
LeetCode 515: Find Largest Value in Each Tree Row
·1 分鐘
LeetCode Medium Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 515 解題筆記:BFS 層序遍歷,每層取最大值;初始值用 -inf
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 173: Binary Search Tree Iterator
·1 分鐘
LeetCode Medium Stack Tree Design Binary-Search-Tree Binary-Tree Iterator
LeetCode 173 解題筆記:攤平成陣列很直接但用 O(n) 空間;follow-up 用 stack 存左側鏈,均攤 O(1)、空間 O(h)
LeetCode 117: Populating Next Right Pointers in Each Node II
·1 分鐘
LeetCode Medium Linked-List Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 117 解題筆記:BFS 一層一層接 next;不是完全二元樹時,只看隔壁節點的小孩會斷掉