BFS
# 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
"""
dq = collections.deque()
dq.append(root)
res_list = []
while dq:
# 不需要一次迭代完一层 只需迭代完所有节点即可
node = dq.popleft()
# 序列化需要记录完整的树 包括None节点 所以需要判空
if node:
# None节点也需要加入 所以直接加入
dq.append(node.left)
dq.append(node.right)
res_list.append(str(node.val))
else:
# None节点用特殊值标记
res_list.append('X')
return ','.join(res_list)
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
if not data or data.startswith('X'):
return None
data_dq = collections.deque(data.split(','))
dq = collections.deque()
root = TreeNode(int(data_dq.popleft()))
dq.append(root)
# 此时 dq和data_dq 的对应关系为 dq[0] 左右节点为 data_dq[0]、data_dq[1]
# 所以 一次dq.popleft() 对应 两次data_dq.popleft()
# 因为dq中都是有效节点 所以dq有值时,必能从data_dq中弹出其左右节点值 所以不必对data_dq判空
while dq:
node = dq.popleft()
tmp = data_dq.popleft()
# 特殊值对应None节点 不用处理
if tmp != 'X':
node.left = TreeNode(int(tmp))
dq.append(node.left)
tmp = data_dq.popleft()
if tmp != 'X':
node.right = TreeNode(int(tmp))
dq.append(node.right)
return root
DFS
想不通的话,就想一层,考虑只有一个节点的情况
# 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
"""
res_list = []
def doit(node):
if node:
res_list.append(str(node.val))
doit(node.left)
doit(node.right)
else:
res_list.append('X')
doit(root)
return ','.join(res_list)
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
data_iter = iter(data.split(','))
def doit():
tmp = next(data_iter)
if tmp == 'X':
return None
root = TreeNode(int(tmp))
root.left = doit()
root.right = doit()
return root
return doit()