题目
Serialization is converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment.
Design an algorithm to serialize and deserialize a binary search tree. There is no restriction on how your serialization/deserialization algorithm should work. You need to ensure that a binary search tree can be serialized to a string, and this string can be deserialized to the original tree structure.
The encoded string should be as compact as possible.
解题思路
- 不考虑BST,直接对树进行前序遍历,空的位置也需要存入,为序列化的结果,反序列化的时候进行递归,如果遇到空返回
 - 考虑BST的性质,序列化的时候不存入空的位置,在反序列化的时候,存入树的范围,如果当前节点在范围内,则为该子树的节点,向下递归,否则返回
 
代码
class Codec:
    def serialize(self, root: TreeNode) -> str:
        """Encodes a tree to a single string.
        """
        if not root:
            return '^'
        return str(root.val) + ' ' + self.serialize(root.left) + ' ' + self.serialize(root.right)
    def deserialize(self, data: str) -> TreeNode:
        """Decodes your encoded data to tree.
        """
        data = deque(data.split(' '))
        def build(data):
            v = data.popleft()
            if v == '^':  
                return None
            node = TreeNode(int(v))
            node.left = build(data)
            node.right = build(data)
            return node
        return build(data)
class Codec:
    def serialize(self, root: TreeNode) -> str:
        """Encodes a tree to a single string.
        """
        ret = []
        def preorder(root):
            if root:
                ret.append(root.val)
                preorder(root.left)
                preorder(root.right)
        preorder(root)
        return ' '.join(map(str, ret))
    def deserialize(self, data: str) -> TreeNode:
        """Decodes your encoded data to tree.
        """
        nums = deque(int(n) for n in data.split())
        def build(mmin, mmax):
            if nums and mmin < nums[0] < mmax:
                n = nums.popleft()
                node = TreeNode(n)
                node.left = build(mmin, n)
                node.right = build(n, mmax)
                return node
            
        return build(float('-inf'), float('inf'))