解题思路:(1)序列化的可以采用前序遍历,用!
表示空节点,每遍历一个节点我们就添加一个逗号,这样在反序列化过程中可以用,
将各个节点的值分离出来,然后按照先序遍历的过程递归的调用序列化函数(2)反序列化的过程就是用先序遍历构建二叉树的过程,因为我们在序列中用!
来表示空节点,所以可以知道哪些节点是叶子节点,我们用栈来记录我们构建二叉树节点的顺序,构建二叉树的过程可以分为三步:(1)一直沿着左分支构建新节点直到遇到!
,将新节点弹入栈中(2)弹出栈顶节点,准备它的遍历右子树,如果右子树为空就继续弹出栈顶元素,直到找到右子树不为空的节点并弹出,之所以要弹出是因为它的左子树已经遍历完了,右子树的根节点已经找到,即将遍历,所以不需要该节点了(3)让最后弹出的节点指向它的右节点并将右节点入栈,然后重复(1)(2)直到所有节点都遍历完了
代码如下:
# 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 root is None:
return "!,"
return str(root.val) + ',' + self.serialize(root.left) + self.serialize(root.right)
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
nodes = data.split(',')[:-1]
size = len(nodes)
print(nodes)
if size == 1:
return None
root = TreeNode(nodes[0])
p = root
i = 1
s = [root]
while(i < size):
while(i < size and nodes[i] != '!'): #一直沿着当前节点的左分支走到底
p.left = TreeNode(int(nodes[i]))
p = p.left
s.append(p)
i += 1
while(i < size and nodes[i] == '!'): #弹出所有右子树为空的节点,并将p指向右子树不为空的节点并弹出
if len(s):
p = s.pop()
i += 1
if i < size: #让p指向右节点,并入栈,之后继续遍历右节点的左分支
p.right = TreeNode(int(nodes[i]))
p = p.right
s.append(p)
i +=1
return root