序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 "[1,2,3,null,null,4,5]"
提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。
解题模板:
Python 3:
# 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
"""
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
# Your Codec object will be instantiated and called as such:
# codec = Codec()
# codec.deserialize(codec.serialize(root))
序列化:
用队列记录同一层的节点,根据先进先出原则,保持队列元素未被使用,进行层序遍历二叉树。
反序列化:
正常的层序构建二叉树。
class Codec:
def serialize(self, root):
if not root:
return ''
from collections import deque
q = deque([root])
result = []
while q:
node = q.popleft()
result.append(str(node.val) if node else 'null')
if node:
q.extend([node.left, node.right])
return ','.join(result)
def deserialize(self, data):
if not data:
return
nodes = [(TreeNode(int(i)) if i != 'null' else None) for i in data.split(',')]
i, j = 0, 1
while j < len(nodes):
if nodes[i] is not None:
nodes[i].left = nodes[j]
j += 1
nodes[i].right = nodes[j]
j += 1
i += 1
return nodes[0]