0
点赞
收藏
分享

微信扫一扫

leetcode:449. 序列化和反序列化二叉搜索树【中序 + 后续】

野见 2022-04-20 阅读 23
python

在这里插入图片描述

序列化和反序列化

序列化:把特定的数据结构变成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

举报

相关推荐

0 条评论