时间:2020-8-24
题目地址:
https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/
题目难度:
Hard
题目描述:
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 "[1,2,3,null,null,4,5]"
提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。
思路1:层序遍历
代码段1:通过
# 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 not root:return "[]"
queue = collections.deque()
queue.append(root)
res = []
while queue:
cur = queue.popleft()
if cur:
res.append(str(cur.val))
queue.append(cur.left)
queue.append(cur.right)
else:
res.append("null")
print('[' + ','.join(res) + ']')
return '[' + ','.join(res) + ']'
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
if data == '[]': return None
value, i = data[1: -1].split(','), 1
root = TreeNode(value[0])
queue = collections.deque()
queue.append(root)
while queue:
cur = queue.popleft()
if value[i] != 'null':
cur.left = TreeNode(int(value[i]))
queue.append(cur.left)
i += 1
if value[i] != 'null':
cur.right = TreeNode(int(value[i]))
queue.append(cur.right)
i += 1
return root
# Your Codec object will be instantiated and called as such:
# codec = Codec()
# codec.deserialize(codec.serialize(root))
总结:
-
层序遍历,都写不出来了(๑ŐдŐ)b
2021-2-3 and 2021-2-4
思路2:前序遍历 or 中序遍历
本来通过一种遍历无法进行序列化和反序列化的,但是这里的二叉树是带空结点的,且前序、后序确定根结点的位置,所以,前序、后序可以,中序不可以。
代码段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
"""
res = []
def traverse(root):
nonlocal res
if root == None:
res.append('#') # 为空时用‘#’替代
return None
res.append(str(root.val))
traverse(root.left)
traverse(root.right)
traverse(root)
result = ','.join(res) # 节点之间以','分割
return result
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
nodes = data.split(',')
def des(nodes):
if len(nodes) == 0:
return None
temp = nodes[0]
del nodes[0]
if temp == '#':
return None
root = TreeNode(int(temp)) # 第一个结点是根结点,剩下的交给递归去处理即可
root.left = des(nodes)
root.right = des(nodes)
return root
return des(nodes)
# Your Codec object will be instantiated and called as such:
# ser = Codec()
# deser = Codec()
# ans = deser.deserialize(ser.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 = []
def traverse(root):
nonlocal res
if root == None:
res.append('#') # 为空时用‘#’替代
return None
traverse(root.left)
traverse(root.right)
res.append(str(root.val))
traverse(root)
result = ','.join(res) # 节点之间以','分割
return result
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
nodes = data.split(',')
def des(nodes):
if len(nodes) == 0:
return None
temp = nodes[-1]
del nodes[-1]
if temp == '#':
return None
root = TreeNode(int(temp)) # 第一个结点是根结点,剩下的交给递归去处理即可
root.right = des(nodes)
root.left = des(nodes)
return root
return des(nodes)
# Your Codec object will be instantiated and called as such:
# ser = Codec()
# deser = Codec()
# ans = deser.deserialize(ser.serialize(root))
总结:
-
上面两种解法不一样的是,序列化的顺序不一样,一个前序,一个后序,反序列化从最后一位开始,先右后左