日野弥生:勉強しよう

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))

フラッシュタブ:LeetCode

题目链接:https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/

上一篇

LeetCode 671 - 二叉树中第二小的节点

下一篇

LeetCode 589 - N 叉树的前序遍历