LeetCode-297-二叉树的序列化与反序列化
2020-11-20 本文已影响0人
阿凯被注册了
原题链接:
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
image.png
解题思路:
- 序列化:层级遍历,用队列存储,每次从队列queue中取出第一个值,若存在node,将
node.val
存入结果列表ans中,并将其左右子树推入队列queue,若不存在,则将'null'写入ans中,最后输出ans的string格式。 - 反序列化:将读入的data取出首位的中括号并用逗号分隔,转换成list,用队列queue来存储节点,首先将list的首元素作为root存入queue,然后以左右子树交替遍历list,如果list[i]不为'null',则表示该元素可以作为节点的val,此时创建节点
TreeNode(alist[i].val)
,可作为root的左右叶子节点,并将该node推入queue进行下一轮判断。
Python3代码:
# Definition for a binary tree node.
# 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 '[]'
queue = [root]
ans = []
while queue:
size = len(queue)
for i in range(size):
node = queue.pop(0)
if node:
ans.append(str(node.val))
queue.append(node.left)
queue.append(node.right)
else:
ans.append('null')
return '[' + ','.join(ans) + ']'
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
if data=='[]':
return None
alist = data[1:-1].split(',')
root = TreeNode(int(alist[0]))
queue = [root]
i = 1
while queue:
node = queue.pop(0)
if alist[i] != 'null':
node.left = TreeNode(int(alist[i]))
queue.append(node.left)
i+=1
if alist[i] != 'null':
node.right = TreeNode(int(alist[i]))
queue.append(node.right)
i+=1
return root
# Your Codec object will be instantiated and called as such:
# ser = Codec()
# deser = Codec()
# ans = deser.deserialize(ser.serialize(root))