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!
評論
