该题解使用深度优先搜索进行序列化和反序列化。序列化时,按照先根节点、然后左子树、最后右子树的顺序递归遍历二叉搜索树,将节点值存储到一个列表中。最后将列表转换为以逗号分隔的字符串。反序列化时,先将字符串按逗号分隔得到节点值列表,然后使用递归辅助函数重建二叉搜索树。递归函数根据当前子数组的起始和结束索引,找到第一个大于根节点值的位置 k,然后递归构建左子树(范围是 i+1 到 k-1)和右子树(范围是 k 到 j)。
时间复杂度: O(n^2)
空间复杂度: O(n)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Codec:
def __init__(self):
self.vals = []
def serialize(self, root: Optional[TreeNode]) -> str:
"""
Encodes a tree to a single string.
"""
self.dfs1(root)
return ",".join(self.vals)
def dfs1(self, root):
"""
Performs a pre-order traversal of the BST and stores node values in a list.
"""
if root is None:
return
self.vals.append(str(root.val))
self.dfs1(root.left)
self.dfs1(root.right)
def deserialize(self, data: str) -> Optional[TreeNode]:
"""
Decodes your encoded data to tree.
"""
if data == "":
return
vals = [int(x) for x in data.split(",")]
return self.helper(vals, 0, len(vals)-1)
def helper(self, vals, i, j):
"""
Recursively reconstructs the BST from the serialized node values.
"""
if i > j:
return
val = vals[i]
root = TreeNode(val)
k = i+1
while k <= j and vals[k] <= val:
k += 1
root.left = self.helper(vals, i+1, k-1)
root.right = self.helper(vals, k, j)
return root
# 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