297. Serialize and Deserialize Binary Tree
Question: Serialize and Deserialize Binary Tree
Solution1. DFS
preorder traversal 中 → 左 → 右
DFS → recursive function
樹轉 data
-
儲存 data 的資料結構:res = list()
-
dfs: def dfs(node):
-
終止條件:
如果 node 為 None,代表走到葉端,資料存 “null”
if node == None:res.append("null")
-
遞回條件:
如果 node 有值,則把值放到 list 中: res.append(node.val)
繼續往下看 left subtree: dfs(node.left)
繼續往下看 right subtree: dfs(node.right)
-
回傳字串資料: return “,”.join(res)
data 建樹
-
data type 從 string 轉 list:
-
一次讀一筆資料
給定 1 pointer → i,從頭開始讀: self.i = 0
每讀一筆, i 往後走一格: i += 1
-
dfs: def build_tree():
-
讀取第 i 筆資料: val = data[self.i]
-
終止條件:
如果讀到 “null”,表示該 node 為 None,i += 1
if val == "null":self.i += 1return None -
遞回條件:
-
中: root = TreeNode(val)
self.i += 1
-
左: left subtree: root.left = build_tree()
-
右: right subtree: root.right = build_tree()
-
-
回傳 root: return root
-
-
回傳建好的樹: return build_tree()
Solution2 BDS
解決 level by level
樹轉 data
-
用 queue 存 data: q = deque([root])
-
res = list()
-
只要 q 裡有 node: while q:
node = q.popleft()
-
存 root 值: res.append(q.val)
-
存 root.left 值:
if node.left:
res.append(node.left.val)
q.append(node.left)
else: res.append(”null”)
-
存 root.right 值:
if node.right:
res.append(node.right.val)
q.append(node.right)
else: res.append(”null”)
-
-
return “,”.join(res)
data 建樹
- data = data.split()
- 讀資料的 pointer: p = 0
# 留給大家寫XD
Comments
Post a Comment