LeetCode449. 序列化和反序列化二叉搜索树(前序版序列化)

1、题目描述

https://leetcode-cn.com/problems/serialize-and-deserialize-bst/

设计一个算法来序列化和反序列化二叉搜索树。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。 

编码的字符串应尽可能紧凑。

LeetCode449. 序列化和反序列化二叉搜索树(前序版序列化)_第1张图片

相关题:297. 二叉树的序列化与反序列化+剑37:序列化二叉树 https://blog.csdn.net/IOT_victor/article/details/104601494

2、代码详解

  • 序列化:先序遍历序列化
  • 反序列化:因为是BST,所以排序后就是其中序遍历,因此反序列化就转换成了105题的从先序与中序构造二叉树的问题

105. 从前序与中序遍历序列构造二叉树+剑7:重建二叉树 https://blog.csdn.net/IOT_victor/article/details/104582658

# 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
        """

        def preorder(root):
            out = []
            if root:
                out += [str(root.val)]
                out += preorder(root.left)
                out += preorder(root.right)
            return out

        return ','.join(preorder(root))

    def deserialize(self, data):
        """Decodes your encoded data to tree.

        :type data: str
        :rtype: TreeNode
        """
        if not data:
            return None
        # 反序列化就转换成了105题的从先序与中序构造二叉树的问题
        def buildTree(preorder, inorder):
            if not preorder:
                return None
            mid = preorder[0]
            i = inorder.index(mid)
            root = TreeNode(mid)
            root.left = buildTree(preorder[1:i + 1], inorder[:i])
            root.right = buildTree(preorder[i + 1:], inorder[i + 1:])
            return root

        preorder = list(map(int, data.split(',')))  # 前序遍历
        inorder = sorted(preorder)  # 中序遍历
        return buildTree(preorder, inorder)
pRoot1 = TreeNode(1)
pRoot2 = TreeNode(2)
pRoot3 = TreeNode(3)
pRoot4 = TreeNode(4)
pRoot5 = TreeNode(5)

pRoot4.left = pRoot2
pRoot4.right = pRoot5
pRoot2.left = pRoot1
pRoot2.right = pRoot3

codec = Codec()

serializeStr = codec.serialize(pRoot4)
print('序列化后的字符串:', serializeStr)
print('反序列化后的根节点值:', codec.deserialize(serializeStr).val)
序列化后的字符串: 4,2,1,3,5
反序列化后的根节点值: 4

 

你可能感兴趣的:(Tree,二叉搜索树)