1.题目描述
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5序列化为 "[1,2,3,null,null,4,5]"
提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。
2.解题思路
实际序列化后的结果是[1, 2, 'null', 'null', 3, 4, 'null', 'null', 5, 'null', 'null']
3.代码实现
# 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
"""
ans = []
def s(root):
if not root:
ans.append("null")
return
ans.append(root.val)
s(root.left)
s(root.right)
s(root)
return ans
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
def d(data):
if not data:
return
t = data.pop(0)
if t == "null":
return
root=TreeNode(t)
root.left = d(data)
root.right = d(data)
return root
root = d(data)
return root
# Your Codec object will be instantiated and called as such:
# codec = Codec()
# codec.deserialize(codec.serialize(root))
方法二:层次遍历的序列化与反序列化
# 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
"""
res = []
que = []
if not root:
return res
que.append(root)
while que:
root = que.pop(0)
if root == "null":
res.append("null")
else:
res.append(root.val)
if root.left:
que.append(root.left)
else:
que.append("null")
if root.right:
que.append(root.right)
else:
que.append("null")
return res
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
if not data:
return None
Root = TreeNode(data.pop(0))
# 需要另一个队列保存已处理的树中的节点,这样可以找到根节点
que = [Root]
while que:
root = que.pop(0)
leftval = data.pop(0)
if leftval!="null":
root.left = TreeNode(leftval)
que.append(root.left)
rightval = data.pop(0)
if rightval!="null":
root.right = TreeNode(rightval)
que.append(root.right)
return Root
# Your Codec object will be instantiated and called as such:
# codec = Codec()
# codec.deserialize(codec.serialize(root))