劍指Offer(Python多種思路實現):序列化二叉樹
面試37題:
題:序列化二叉樹
題目:請實現兩個函數,分別用來序列化和反序列化二叉樹
解題思路一:首先來看二叉樹的序列化,二叉樹的序列化就是採用前序遍歷二叉樹輸出節點,再碰到左子節點或者右子節點爲None的時候輸出一個特殊字符”#”。對於反序列化,就是針對輸入的一個序列構建一棵二叉樹,我們可以設置一個指針先指向序列的最開始,然後把指針指向位置的數字轉化爲二叉樹的結點,後移一個數字,繼續轉化爲左子樹和右子樹。當遇到當前指向的字符爲特殊字符”#”或者指針超出了序列的長度,則返回None,指針後移,繼續遍歷。
class Solution:
flag=-1
def Serialize(self, root):
# write code here
if not root:
return '#'
return str(root.val)+','+self.Serialize(root.left)+','+self.Serialize(root.right)
def Deserialize(self, s):
# write code here
self.flag+=1
lis=s.split(',')
if self.flag>=len(s):
return None
root=None
if lis[self.flag]!='#':
root=TreeNode(int(lis[self.flag]))
root.left=self.Deserialize(s)
root.right=self.Deserialize(s)
return root
解題思路二:
class Codec:
def serialize(self, root):
if not root:
return '$'
return str(root.val) + ',' + self.serialize(root.left) + ',' + self.serialize(root.right)
def deserialize(self, data):
def deserialize_tree(nodes):
val = next(nodes)
if val == '$':
return None
root = TreeNode(val)
root.left = deserialize_tree(nodes)
root.right = deserialize_tree(nodes)
return root
nodes = iter(data.split(','))
return deserialize_tree(nodes)