1、题目描述
https://leetcode-cn.com/problems/serialize-and-deserialize-bst/
设计一个算法来序列化和反序列化二叉搜索树。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。
编码的字符串应尽可能紧凑。
相关题: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