请实现两个函数,分别用来序列化和反序列化二叉树。
示例:
# 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
"""
# 如果节点为None,直接返回[]?
if not root:
return []
# 这个队列是一个列表
# 这个队列是存储节点的
queue = collections.deque()
queue.append(root)
# 这个队列是存储结果值的
res = []
while queue:
# 将该队列的最左边的值弹出,既是先进先出
node = queue.popleft()
# 如果节点非空
if node:
# 将这个节点的值存储结果列表中
res.append(str(node.val))
# 往队列中存储左右节点,最终结果列表中存储的是一个二叉树,每一层的值
queue.append(node.left)
queue.append(node.right)
else:
# 节点为空,直接插入null
res.append("null")
return ",".join(res)
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
if not data:
return
vals = data.split(",")
# 反序列化的
if len(vals) == 0:
return
root = TreeNode(vals[0])
i = 1
# 存储节点的队列
queue = collections.deque()
queue.append(root)
# 如果节点列表不为空,一边序列化,一边放入队列中,当队列中没有数据了,就序列化完成了
while queue:
node = queue.popleft()
# 如果序列化后的节点上的值不等于null,说明该节点不是空节点
if vals[i] != "null":
node.left = TreeNode(vals[i])
queue.append(node.left)
# 遍历下一个序列化后节点的值,则索引需要++
i += 1
if vals[i] != "null":
node.right = TreeNode(vals[i])
queue.append(node.right)
i += 1
return root