Skip to main content

449.序列化和反序列化二叉搜索树

标签: tree, design

难度: Medium

通过率: 58.15%

原题链接: https://leetcode.com/problems/serialize-and-deserialize-bst/description/

题目描述

设计一个算法来序列化和反序列化一个二叉搜索树。序列化是将数据结构或对象转换为可以存储或传输的比特序列的过程,反序列化是将序列转换回原始数据结构的过程。

解题思路

为了序列化二叉搜索树,我们可以利用它的中序遍历性质——左子树节点值小于根节点,右子树节点值大于根节点。假设我们使用前序遍历的方式来序列化树,因为前序遍历首先访问根节点,然后是左子树,最后是右子树,这样序列化字符串自然就能在反序列化时递归地重建树。\n \n序列化时:

  • 如果当前节点为空,返回空字符串。
  • 否则,访问当前节点,将它的值加入序列化结果。
  • 递归访问左子树和右子树,将结果依次拼接。\n \n反序列化时:
  • 将字符串分割为节点列表。
  • 利用前序遍历特性,递归生成二叉搜索树,保证左子树节点小于当前节点,右子树节点大于当前节点。

代码实现

class Codec:    
def serialize(self, root):
"""Encodes a tree to a single string."""
# 使用前序遍历(前序遍历)
def preorder(node):
return [str(node.val)] + preorder(node.left) + preorder(node.right) if node else []

return ' '.join(preorder(root))

def deserialize(self, data):
"""Decodes your encoded data to tree."""
# 使用迭代器
def build_tree(iterator, min_val, max_val):
if iterator and (min_val < iterator[0] < max_val):
val = iterator.pop(0)
node = TreeNode(val)
node.left = build_tree(iterator, min_val, val)
node.right = build_tree(iterator, val, max_val)
return node
return None

# 使用map(int, data.split()) 来转换字符串为整数
return build_tree(list(map(int, data.split())), float('-inf'), float('inf'))

复杂度分析

时间复杂度:序列化和反序列化的时间复杂度均为 O(n)O(n),其中 nn 是树中的节点数。每个节点被访问一次。

空间复杂度:由于递归的调用栈深度为 O(h)O(h),其中 hh 是树的高度,因此空间复杂度也为 O(n)O(n),因为在最坏情况下(例如链表形式的树) h=nh = n.