序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 “[1,2,3,null,null,4,5]”
想法:使用栈和广度优先算法遍历树来实现序列化和反序列化
1.序列化:层序遍历(广度优先),依次遍历栈中所有根节点保存左右子树值,如遇左右子树非空时需要保存根节点用于后续访问,如遇空值则跳过
2.反序列化:依次遍历序列中所有值,弹出栈中根节点,如果不为空则为其添加左子树和右子树,如果遇到空则直接跳过
# 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
"""
# 树为空,直接返回
if root == None:
return []
# 保存当前根节点
stack = [root]
# 保存序列
series = [root.val]
while stack:
tree = stack.pop(0)
# 如果当前左节点不为空
if tree.left != None:
# 序列中添加该值
series.append(tree.left.val)
# 栈中保存这个非空根节点
stack.append(tree.left)
else:
# 序列中添加None
series.append(None)
# 如果当前右节点不为空,处理同左节点
if tree.right != None:
series.append(tree.right.val)
stack.append(tree.right)
else:
series.append(None)
return series
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
# 序列为空,直接返回
if data == []:
return None
# 保存树
deseries = TreeNode(data.pop(0))
# 保存当前所有非空根节点
stack = [deseries]
while stack:
root = stack.pop(0)
# 如果根节点为空,跳过
if root.val == None:
continue
# 弹出左节点值,如果为空跳过
value = data.pop(0)
if value != None:
# 生成左子树
left = TreeNode(value)
# 连接子树
root.left = left
# 保存左子树根节点用于后续访问
stack.append(left)
# 处理右节点同左节点处
value = data.pop(0)
if value != None:
right = TreeNode(value)
root.right = right
stack.append(right)
return deseries
# Your Codec object will be instantiated and called as such:
# codec = Codec()
# codec.deserialize(codec.serialize(root))