阅读目录
题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
思路及Python实现
- 二叉树的序列化
用先序遍历,会比较好,因为先序遍历的顺序:根,左,右 ;如果没有下一个结点就添加一个“#”!具体做法:先序序列化二叉树:定义一个res数组保存序列过程中的结果,按照先序遍历方式遍历二叉树,若结点非空则把 “结点值” append到res中;若结点空则把 “#” append到res中;最后用用res数组生成字符串就是序列化结果! - 二叉树的反序列化
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
具体做法:分割二叉树的序列化字符串,遍历nodes数组建立二叉树,如果当前遍历元素非 # 则作为一个结点插入树中作为上一结点的左子树,当前遍历元素为 # 则表示此子树已结束,遍历下一元素作为上一结点的右子树!
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def Serialize(self, root): # 序列化
ret_list = []
def pre_order(root):
if ret_list is []:
return None
if root is None:
ret_list.append("#")
return
ret_list.append(str(root.val))
pre_order(root.left)
pre_order(root.right)
pre_order(root)
return ' '.join(ret_list)
def Deserialize(self, s): # 反序列化
ret_list = s.split()
def de_pre_order():
root_val = ret_list.pop(0)
if root_val == "#":
return None
node = TreeNode(int(root_val))
left_node = de_pre_order()
right_node = de_pre_order()
node.left = left_node
node.right = right_node
return node
pRoot = de_pre_order()
return pRoot