类型:树
-
序列化二叉树 ❤️ ⭐
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)