题目
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 “[1,2,3,null,null,4,5]”
【困难】
【分析1】层次遍历来做序列化;然后从树的左到右插入子树
class Codec:
def serialize(self,root):
"""Encodes a tree to a single string.
:type root: TreeNode
:rtype: str
"""
if root==None:
return []
data=[]
nodes=[root]
while nodes:
node=nodes.pop(0)
if node !="#":
data.append(node.val)
else:
data.append('')
continue
if node.left:
nodes.append(node.left)
else:
nodes.append("#")
if node.right:
nodes.append(node.right)
else:
nodes.append("#")
for i in range(len(data)-1,0,-1):
if data[i]=='':
data.pop() #将data后面的None去掉
else:
break
return data
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
if len(data)==0:
return None
t_root=TreeNode(data.pop(0))
nodes=[t_root]
left_flag=True
while nodes and len(data)>0:
node=nodes.pop(0)
i=0
while i<2 and len(data)>0:
val=data.pop(0)
if val!='':
#print("#")
if left_flag:
node.left=TreeNode(val)
nodes.append(node.left)
left_flag=not left_flag
#print("left")
else:
node.right=TreeNode(val)
nodes.append(node.right)
#print("right")
left_flag=not left_flag
else:
if left_flag:
node.left=None
left_flag=not left_flag
#print("leftNone")
else:
node.right=None
left_flag=not left_flag
#print("rightNone")
i=i+1
return t_root
【分析2】抛却层次遍历,还可以用前序遍历来做,也是很简单