題目描述:設計將二元樹編碼為字串(序列化)和從字串還原二元樹(反序列化)的演算法。
解題思路:前序遍歷序列化:遞迴訪問節點,空節點記錄為 "#",各值以逗號分隔。反序列化:將字串分割後,遞迴按前序重建樹——每次讀一個值,若為 "#" 回傳 null,否則建立節點後遞迴建左右子樹。
時間複雜度:O(n) — 序列化和反序列化各訪問每個節點一次。
空間複雜度:O(n) — 序列化字串大小,加上 O(h) 遞迴棧。
Serialize (preorder): 1. If null: append '#' 2. Append node.val 3. Recurse left, recurse right Deserialize: 1. Read next token from stream 2. If '#': return null 3. Create node with value 4. node.left = deserialize(); node.right = deserialize() 5. Return node
中序 + 前序重建 O(n) 時間,O(n) 空間:編碼兩種遍歷,反序列化時重建樹 — 等價但傳輸資料量更多。
標記 None 節點 O(n) 時間,O(n) 空間:序列化時直接用字符表示 None(如 #),簡化解析 — 此即本方法。