题目
请实现两个函数,分别用来序列化和反序列化二叉树
思路
- 先序遍历二叉树,字符串之间用 “,”隔开,需要将空节点也存入字符串中
- 反序列化,按前序遍历“根左右”的顺序,根节点位于其左右子节点的前面,即非空的第一个节点是某子树的根节点,左右子节点在该根节点后。
- 进一步理解了二叉树的递归,注意定义清楚递归函数实现的功能,写代码才逻辑清楚。对于二叉树,实现对根节点的操作之后,递归运用于左右子树(也是二叉树),递归终止条件是节点为空的情况。
代码
class Solution:
def __init__(self):
self.seri = ""
self.s = []
def Serialize(self, root):
'''# 自己写的代码冗长且需要定义全局变量,如果多次调用该函数,会导致序列不断累加而出错。
if root != None:
self.seri += str(root.val) + ','
else:
self.seri += 'n,'
return
self.Serialize(root.left)
self.Serialize(root.right)
return self.seri[:-1]'''
if not root:
return 'n'
return str(root.val) +',' + self.Serialize(root.left) +','+ self.Serialize(root.right)
# 定义清楚递归函数实现的功能,把字符串,反序列化为二叉树
def Deserialize(self, s):
if len(s) == 0:
return
if self.s == []:
self.s = s.split(',')
'''v = s[0]
self.s = s[2:] #只适用于一位数字,如果数字是10,100出错啊'''
v = self.s.pop(0) # 左子树pop完成之后,轮到右子树对应的序列
if v != 'n':
root = TreeNode(int(v))
root.left = self.Deserialize(self.s)
root.right = self.Deserialize(self.s)
return root
else:
return None