日野弥生:勉強しよう
LeetCode 297 - 二叉树的序列化与反序列化
发表于2025年03月26日
本题关键在于理解深度优先搜索路径的唯一性,不必要拘泥于实现完全二叉树的样貌而费劲地填充稀疏二叉树的所有空叶子节点。
class Codec:
def serialize(self, root):
"""Encodes a tree to a single string.
:type root: TreeNode
:rtype: str
"""
retStr = []
def serializeIMPL(root):
nonlocal retStr
if not root:
return
retStr.append(root.val)
if root.left:
serializeIMPL(root.left)
else:
# 如果是空则直接返回非法值,无需关注树是否是满二叉树
retStr.append(sys.maxsize)
if root.right:
serializeIMPL(root.right)
else:
retStr.append(sys.maxsize)
serializeIMPL(root)
# 用逗号把列表转变为字符串返回
return ",".join(map(str, retStr))
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
# 处理字符串为空的情况
if not data:
return None
# 把字符串重新解析为列表
values = deque(map(int, data.split(",")))
def deserializeIMPL():
if not values:
return None
val = values.popleft()
if val == sys.maxsize:
return None
node = TreeNode(val)
先根遍历产生树
node.left = deserializeIMPL()
node.right = deserializeIMPL()
return node
return deserializeIMPL()
# Your Codec object will be instantiated and called as such:
# ser = Codec()
# deser = Codec()
# ans = deser.deserialize(ser.serialize(root))