题目:
请实现两个函数,分别用来序列化和反序列化二叉树。
你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
思路:首先我们要清楚这一道题是要我们做什么,就是把一个二叉树序列化为字符串,也就是将每一位都变为字符串;但是还要再返回来,将字符串每一位都变为二叉树中的节点,关键就是变回来的时候是不能变化位置的,所以这里就要求我们将空的节点也以null存放到字符串中。
遍历二叉树采用的是借用队列的层级遍历,只不过这里空的节点也存储起来,将字符串反序列回来的时候,还是用到队列将每个节点一层一层的创建出来。
代码:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Codec:
#这一题主要是理解序列化和反序列化的关系,序列化使将二叉树序列化为字符串,反序列化使将它变为正常的树
#需要注意的就是要实现完整的序列化,就要把null的空节点也算进去,加到字符串或者从字符串变回来的时候判断是否为null
def serialize(self, root):
"""Encodes a tree to a single string.
:type root: TreeNode
:rtype: str
"""
#首先是实现序列化
if not root:return "[]"#如果初始二叉树就是不存在的话,那就直接返回[],并且字符串化
queue=collections.deque()#创建一个双端队列
queue.append(root)
res=[]
while queue:
node = queue.popleft()#取出来第一个元素,不管有没有都赋值给node
if node:
res.append(str(node.val))
queue.append(node.left)
queue.append(node.right)#这样就是不管有没有孩子都加进去一个
else:
res.append("null")
return '['+','.join(res)+']'
#反序列化回来
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
if data=="[]":return
queue=collections.deque()
#首先将data两端的[]去掉,并且将","去掉
vals=data[1:-1].split(",")
i=1#除去根节点,i从1开始访问vals
root=TreeNode(int(vals[0]))#将第一个点作为根节点
queue.append(root)
while queue:
node=queue.popleft()#取出来第一个元素是为了给它创建孩子节点,不管是不是null,都要将i每次加1
if vals[i]!="null":
node.left=TreeNode(int(vals[i]))
queue.append(node.left)
i+=1
if vals[i]!="null":
node.right=TreeNode(int(vals[i]))
queue.append(node.right)
i+=1
return root