跳过正文
  1. leetcode 题解/

37_序列化二叉树

·101 字·1 分钟

类型:树

  • 序列化二叉树 ❤️ ⭐

    https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lcof/

    ❓ 请实现两个函数,分别用来序列化和反序列化二叉树。

    💡 按层记录

    序列化和反序列化,关键在于二者的可逆性。也就是信息的完整性。本质在于找到一种存储方式,以及对应的序列、反序列方法。

    像一般的前序、中序、后序遍历,其所记录的信息都是不完整的。要记录完整信息当然也不是难事,比如「前序+中序」其实就是一个完整信息,参考:105. 从前序与中序遍历序列构造二叉树 。

    此处我们使用更为简单直观的存储方式——按层存储。其中的关键在于,我们要将按照完全二叉树的规格的存储,对于不存在的结点,我们用 null 来表示,这样才能够消除歧义。

    class Codec:
        def serialize(self, root):
            if not root: return "[]"
            queue = collections.deque()
            queue.append(root)
            res = []
            while queue:
                node = queue.popleft()
                if node:
                    res.append(str(node.val))
                    queue.append(node.left)
                    queue.append(node.right)
                else: res.append("null")
            return '[' + ','.join(res) + ']'
    
        def deserialize(self, data):
            if data == "[]": return
            vals, i = data[1:-1].split(','), 1
            root = TreeNode(int(vals[0]))
            queue = collections.deque()
            queue.append(root)
            while queue:
                node = queue.popleft()
                if vals[i] != "null":
                    node.left = TreeNode(int(vals[i]))
                    queue.append(node.left)
                i += 1
                if vals[i] != "null":
                    node.right = TreeNode(int(vals[i]))
                    queue.append(node.right)
                i += 1
            return root

    时间复杂度:O(n),空间复杂度:O(n)