题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
思路
序列化
- 先序遍历
- 遇到没有结点的,存入'$'
反序列化
- 数组从头遍历
- 在还没遇到'$',就一直构建树
- 遇到了就返回根节点
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def __init__(self):
self.flag=-1
def Serialize(self, root):
# write code here
res=[]
self.preorder(root,res)
return ",".join(res)
def preorder(self,root,res):
if not root:
res.append("$")
else:
res.append(str(root.val))
self.preorder(root.left,res)
self.preorder(root.right,res)
def Deserialize(self, s):
# write code here
self.flag+=1
l = s.split(",")
i=self.flag
if i>=len(l):
return None
root=None
if l[i]!="$":
root=TreeNode(int(l[i]))
root.left=self.Deserialize(s)
root.right=self.Deserialize(s)
return root
测试用例
if __name__=='__main__':
s=Solution()
# 构建二叉树
root=TreeNode(1)
node1=TreeNode(2)
node2=TreeNode(3)
node3=TreeNode(4)
node4=TreeNode(5)
node5=TreeNode(6)
root.left=node1
root.right=node2
node1.left=node3
node2.left=node4
node2.right=node5
node3.left=node3.right=node1.right=node4.left=node4.right=node5.left=node5.right=None
# 调用序列化函数
print(s.Serialize(root))
# 调用反序列化函数
s1="1,2,4,$,$,$,3,5,$,$,6,$,$"
root=s.Deserialize(s1)
# 用先序遍历打印反序列化结果
res=[]
s.preorder(root,res)
print(res)