跳到主要内容

面试题37. 序列化二叉树【困难】

题目描述

做题链接:面试题37. 序列化二叉树【困难】

按照LeetCode的生成规则生成并解析二叉树

解题思路

序列化的部分

我们之前已经在 面试题 28.对称的二叉树 中利用了层次遍历的方式去验证,这里也是一样的方法,就是把 null 值也一起记录下来,但是不同的是,我们最后一行的 null 值就不要记录了,这里直接用 level 去筛选就可以了。

包含 null 值的二叉树可以看做 完全二叉树 ,而完全二叉树的节点个数是 $2 \times level - 1$

反序列化的部分

用层次遍历的方式生成

代码

import collections

class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None

class Codec:

def serialize(self, root):
"""Encodes a tree to a single string.

:type root: TreeNode
:rtype: str
"""
if not root: return "[]"
res, queue = [], collections.deque()
queue.append(root)
level = 0
while queue:
level += 1
for _ in range(len(queue)):
node = queue.popleft()
if node:
res.append(node.val)
queue.append(node.left)
queue.append(node.right)
else:
res.append("null")

res = res[:2**level - 1] # 把最后的 null 值过滤掉
return "[" + ",".join([str(_) for _ in res]) + "]"


def deserialize(self, data):
"""Decodes your encoded data to tree.

:type data: str
:rtype: TreeNode
"""
if data == "[]": return None
vals, i = data[1:-1].split(','), 1
root = TreeNode(int(vals[0]))
queue = collections.deque()
queue.append(root)
while queue and i < len(vals):
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