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

LeetCode 331: Verify Preorder Serialization of a Binary Tree

·1 分鐘· ·
LeetCode Medium String Stack 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(一次通過)

解題思路
#

不用真的建樹,只要數「還有幾個位置可以放節點」:

  • 一開始有 1 個位置(給根)。
  • 每讀到一個節點(包含 #),用掉 1 個位置。
  • 非空節點會再開出 2 個位置(左右小孩)。

位置數在中途變成負的,表示節點比位置多,不合法;全部讀完要剛好是 0,不然有位置沒填滿。

例如 9,#,#,1:讀完 9,#,# 位置剛好用完,再讀 1 就變成 -1,回傳 False。

我的嘗試
#

一次通過。

正確解法
#

class Solution:
    def isValidSerialization(self, preorder: str) -> bool:
        slots = 1
        for node in preorder.split(","):
            slots -= 1
            if slots < 0:
                return False
            if node != "#":
                slots += 2
        return slots == 0

複雜度
#

時間 O(n),空間 O(n)(split 的結果;逐字元掃描可以做到 O(1))。

要特別避免的錯誤
#

  • 要先扣掉位置、檢查是否小於 0,最後才加 2。先加 2 的話,#,1,# 會被判成合法,但樹在第一個 # 就結束了。
  • 最後要檢查剛好等於 0,不能只檢查中途沒變負。
  • 值可能是多位數,要用逗號切開,不能一個字元一個字元當節點。

面試口說整理
#

我不建樹,只數空位。一開始有一個位置給根,每個節點用掉一個位置,非空節點再開出兩個。中途空位變負就不合法,最後要剛好用完。時間 O(n)。也可以用 stack 把「數字、#、#」不斷收成一個 #,最後剩一個 # 就合法。

相關文章

LeetCode 449: Serialize and Deserialize BST
·1 分鐘
LeetCode Medium String Tree Depth-First-Search Breadth-First-Search Design Binary-Search-Tree Binary-Tree
LeetCode 449 解題筆記:BST 只要存前序,不用空節點標記;反序列化帶著上下界遞迴,O(n)
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 606: Construct String from Binary Tree
·1 分鐘
LeetCode Medium String Tree Depth-First-Search Binary-Tree
LeetCode 606 解題筆記:前序輸出,左子樹空但右子樹不空時要留一個空括號 (),右子樹空時可以省略
LeetCode 1028: Recover a Tree From Preorder Traversal
·2 分鐘
LeetCode Hard Tree Binary-Tree Dfs Stack String
LeetCode 1028 解題筆記:用 stack 維護從根到目前節點的路徑,stack 長度就是深度
LeetCode 297: Serialize and Deserialize Binary Tree
·1 分鐘
LeetCode Hard String Tree Depth-First-Search Breadth-First-Search Design Binary-Tree
LeetCode 297 解題筆記:前序遍歷加上空節點標記就能唯一還原樹;反序列化用迭代器依序取值
LeetCode 450: Delete Node in a BST
·1 分鐘
LeetCode Medium Tree Binary-Search-Tree Binary-Tree
LeetCode 450 解題筆記:找到節點後分三種情況:沒有小孩、一個小孩直接接上,兩個小孩用右子樹最小值替換再刪掉它