该题解采用层次遍历(BFS)的方式进行二叉树的序列化与反序列化。对于序列化,从根节点开始,使用队列存储每层的节点,依次将节点的值转为字符串,若节点为空则存储为'null'。结果存储为一个由逗号分隔的字符串,外围用方括号包裹。反序列化时,将字符串转换回二叉树。首先将除去方括号的字符串按逗号分隔成数组,然后使用一个队列来按层次重建树结构。每次从队列中取出一个节点作为父节点,然后读取数组中的两个值,分别设置为左右子节点,若值为'null'则对应子节点为空。这样,通过数组的顺序和队列中节点的顺序可以正确重建整个树结构。
时间复杂度: O(n)
空间复杂度: O(n)
class Codec:
def serialize(self, root):
\"\"\"Encodes a tree to a single string.
:type root: TreeNode
:rtype: str
\"\"\"
if not root: return '[]' # 空树返回空数组表示
res = []
que = collections.deque()
que.append(root)
while que:
tmp = que.popleft()
if tmp:
res.append(str(tmp.val)) # 添加当前节点的值
que.append(tmp.left) # 将左子节点加入队列
que.append(tmp.right) # 将右子节点加入队列
else:
res.append('null') # 空节点添加'null'
return '[' + ','.join(res) + ']'
def deserialize(self, data):
\"\"\"Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
\"\"\"
if data == '[null]' or data == '[]': return # 空数据返回空树
val, i = data[1:-1].split(','), 1 # 移除方括号并分割字符串
root = TreeNode(int(val[0])) # 创建根节点
que = collections.deque()
que.append(root) # 加入队列以进行层次遍历
while que:
tmp = que.popleft()
if val[i] != 'null':
tmp.left = TreeNode(int(val[i])) # 创建左子节点
que.append(tmp.left) # 加入队列
i += 1
if val[i] != 'null':
tmp.right = TreeNode(int(val[i])) # 创建右子节点
que.append(tmp.right) # 加入队列
i += 1
return root