297. Serialize and Deserialize Binary Tree
題目網址:https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/
題意:Serialize 是將資料結構轉換成一系列的 bit, 進而將其儲存在 file 或 buffer 中, 也可以透過網路傳輸到另一台電腦, 並重構得到原資料。
設計一個 BT 的 Serialize 和 Deserialize 功能, 讓一個 BT 可透過 Serialize 轉換成 string, 並透過 Deserialize 重構回 BT。
Solution 1:
想法:利用 DFS, 用 preorder 遍歷 BT, 並加入到 string 中, 記得
val
之間要用','
隔開, 且用'#'
代表nullptr
idx
的 left child 必為idx + 1
- 當
decodeDFS(nodes, idx)
做完後,idx
會指向下一個 preorder 位置- 所以當
root->left = decodeDFS(nodes, idx)
做完後,idx
會指向root->right
的位置e.g.
root = [1,2,3]
, 可得到nodes = ["1","2","#","#","3","#","#"]
idx = 0
時, 呼叫encodeDFS(nodes, 0)
- nodes[0]->left :
- 會先呼叫
encodeDFS(nodes, 1)
- 首先會先呼叫
encodeDFS(nodes, 2)
- 由於
nodes[2]
為"#"
, idx + 1 = 3, 並返回 nullptr
➔nodes[1]
得到 left child = nullptr- 接著呼叫
encodeDFS(nodes, 3)
, 由於nodes[3]
為"#"
, idx + 1 = 4, 並返回 nullptr
➔nodes[1]
得到 right child = nullptr- 然後
encodeDFS(nodes, 1)
返回nodes[1]
➔nodes[0]
得到其 left child- nodes[0]->right :
- 接著, 呼叫
encodeDFS(nodes, 4)
- 首先會先呼叫
encodeDFS(nodes, 5)
- 由於
nodes[5]
為"#"
, idx + 1 = 6, 並返回 nullptr
➔nodes[4]
得到 left child = nullptr- 接著呼叫
encodeDFS(nodes, 6)
, 由於nodes[6]
為"#"
, idx + 1 = 7, 並返回 nullptr
➔nodes[4]
得到 right child = nullptr- 然後
encodeDFS(nodes, 4)
返回nodes[4]
➔nodes[0]
得到其 right child
class Codec { |
- time:$O(n)$ ➔ 遍歷 BT
- space:$O(n)$ ➔
nodes
Solution 2:
想法:利用 BFS, 用 level-order 遍歷 BT, 並建立 string。然後用
i
來遍歷 parent node, 而j
用來指向nodes[i]
的 child nodee.g.
root = [1,2,3]
, 可得到nodes = ["1","2","3","#","#","#","#"]
- i = 0 時, j = 1 ➔
nodes[0]
得到nodes[1]
、nodes[2]
分別為其 left、right child
- j += 2 指向下一個不為 nullptr 的
nodes[i]
之 left child- i += 1 移動到下一個 parent node
- i = 1 時, j = 3 ➔
nodes[1]
得到nodes[3]
、nodes[4]
分別為其 left、right child
- j += 2 指向下一個不為 nullptr 的
nodes[i]
之 left child- i += 1 移動到下一個 parent node
- i = 3 時, j = 5 ➔
nodes[3]
得到nodes[5]
、nodes[6]
分別為其 left、right child
- j += 2 指向下一個不為 nullptr 的
nodes[i]
之 left child- i += 1 移動到下一個 parent node
- i = 4 時, j = 7 ➔ 跳出迴圈
class Codec { |
- time:$O(n)$ ➔ 遍歷 BT
- space:$O(n)$ ➔
nodes
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論