請實現兩個函式,分別用來序列化和反序列化二叉樹
例:
樹:
1/ \
2 3
/ / \
4 5 6
序列化:
[1, 2, 4, $, $, $, 3, 5, $, $, 6, $, $]
容易發現序列化其實就是帶none的前序遍歷。所以題目就是完成乙個前序遍歷將節點值存入列表,遍歷列表按前序生成一棵二叉樹。
時間複雜度:o(n)
空間複雜度:o(n)
from datstru import treenode
defserialize
(root)
:"""
:param root:tree root
:return:pre-order val list
"""defpreorder
(root):if
not root:
'$')
return
preorder(root.left)
preorder(root.right)
return seq
seq =
preorder(root)
return seq
defdeserialize
(sequence)
:"""
:param sequence:pre-order val list
:return: tree root
"""defrebuild
(seqence, i)
: val = seqence[i]
if val ==
'$':
return
none
root = treenode(val)
root.left = rebuild(seqence, i+1)
root.right = rebuild(seqence, i+2)
return root
ifnot sequence:
return
none
return rebuild(sequence,
0)
deserialize函式一開始也使用了列表pop方法,一樣pop會修改列表。不如直接索引值來的快,這一點可以在後面leetcode題上測試。
序列化是將乙個資料結構或者物件轉換為連續的位元位的操作,進而可以將轉換後的資料儲存在乙個檔案或者記憶體中,同時也可以通過網路傳輸到另乙個計算機環境,採取相反方式重構得到原資料。
請設計乙個演算法來實現二叉樹的序列化與反序列化。這裡不限定你的序列 / 反序列化演算法執行邏輯,你只需要保證乙個二叉樹可以被序列化為乙個字串並且將這個字串反序列化為原始的樹結構。
示例:
你可以將以下二叉樹:
1/ \
2 3
/ \4 5
說明: 不要使用類的成員 / 全域性 / 靜態變數來儲存狀態,你的序列化和反序列化演算法應該是無狀態的。
# definition for a binary tree node.
# class treenode(object):
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class
codec
:def
serialize
(self, root)
:"""encodes a tree to a single string.
:type root: treenode
:rtype: str
"""l_node =
[root]
seq =
ni =
0while ni <
len(l_node)
: cur = l_node[ni]
if cur:
str(cur.val)
) l_node.extend(
[cur.left, cur.right]
)else
:'null'
) ni +=
1return
'['+
','.join(seq)
+']'
defdeserialize
(self, data)
:"""decodes your encoded data to tree.
:type data: str
:rtype: treenode
"""
data = data[1:
-1].split(
',')
root_val = data[0]
if root_val ==
'null'
:return
else
: root = treenode(root_val)
node =
[root]
di =
1 ni =
0while di <
len(data)
: cur = node[ni]
if cur:
val_l = data[di]
val_r = data[di+1]
cur.left = treenode(
int(val_l)
)if val_l !=
'null'
else
none
cur.right = treenode(
int(val_r)
)if val_r !=
'null'
else
none
node.extend(
[cur.left, cur.right]
) di +=
2 ni +=
1return root
# your codec object will be instantiated and called as such:
# codec = codec()
# codec.deserialize(codec.serialize(root))
劍指offer37 序列化二叉樹
請實現兩個函式,分別用來序列化和反序列化二叉樹 二叉樹的序列化是指 把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序 中序 後序 層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點 以 表示...
《劍指offer》 37 序列化二叉樹
請實現兩個函式,分別用來序列化和反序列化二叉樹。示例 你可以將以下二叉樹 1 2 3 4 5 序列化為 1,2,3,null,null,4,5 層序遍歷,使用乙個佇列輔助queue 的 push pop front to string複雜度 o時間複雜度 o n 空間複雜度 o n definiti...
劍指 Offer 37 序列化二叉樹
請實現兩個函式,分別用來序列化和反序列化二叉樹。示例 你可以將以下二叉樹 1 2 3 4 5序列化為 1,2,3,null,null,4,5 這個題目出的很籠統,沒有任何規定,很是奇怪,在這裡利用了輸入輸出流解題。definition for a binary tree node.struct tr...