序列化和反序列化
序列化:把特定的数据结构变成str方便传输
反序列化:把str转回特定的数据结构
分析
由于是bst中序已经知道了 因此只需要前序/后序就可以还原tree
如果前序的话根左右需要用popleft的deque所有我们选择后续
因此序列化就是tree-》postorder,反序列化就是postorder-》tree
ac code
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Codec:
def serialize(self, root: TreeNode) -> str:
"""Encodes a tree to a single string.
"""
def postOrder(root):
if not root:
return []
else:
return postOrder(root.left) + postOrder(root.right) + [root.val]
#print(' '.join(map(str, postOrder(root))))
return ' '.join(map(str, postOrder(root)))
def deserialize(self, data: str) -> TreeNode:
"""Decodes your encoded data to tree.
"""
# 已知后续和中序,还原树
def build(lower = -inf, upper = inf):
if not data or data[-1] < lower or data[-1] > upper:
# 没有数据或者越界了
return None
val = data.pop()
root = TreeNode(val)# 目前的根
# 给左右子树卡死了范围
# 从而保证是二叉搜索(也就是中序是顺序)
root.right = build(val, upper)
root.left = build(lower, val)
return root
# 有数据才变回int(因为会存在null的情况,这些不用管)
data = [int(x) for x in data.split(' ') if x]
return build()
# Your Codec object will be instantiated and called as such:
# Your Codec object will be instantiated and called as such:
# ser = Codec()
# deser = Codec()
# tree = ser.serialize(root)
# ans = deser.deserialize(tree)
# return ans
总结
tree->postorder的时候空的节点用[]代替无需考虑
而由postorder->tree的时候用了经典套路
build(lower = -inf, upper = inf)来框定左右孩子的范围
注意要先赋值rigth后left,因为用的是pop方法
所以看似在build中只考虑了后续,其实在recursion过程中的范围就是inOrder