解题思路:
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
"""
res = ''
if not root:
return res
node_pool = [root]
res = str(root.val)
while node_pool:
tmp = []
for node in node_pool:
if not node.left:
res += ',' + 'null'
else:
res += ',' + str(node.left.val)
tmp.append(node.left)
if not node.right:
res += ',' + 'null'
else:
res += ',' + str(node.right.val)
tmp.append(node.right)
node_pool = tmp
print(res)
return res
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
if not data:
return None
str_set = data.split(',')
res = TreeNode(int(str_set[0]))
node_pool = [res]
ptr = 1
nums = 2
while ptr < len(str_set):
child_pool = []
child_set = str_set[ptr:ptr+nums]
for i, node in enumerate(node_pool):
if child_set[2*i] != 'null':
node.left = TreeNode(int(child_set[2*i]))
child_pool.append(node.left)
if child_set[2*i + 1] != 'null':
node.right = TreeNode(int(child_set[2*i+1]))
child_pool.append(node.right)
ptr += nums
nums = 2 * len(child_pool)
node_pool = child_pool
return res
# Your Codec object will be instantiated and called as such:
# codec = Codec()
# codec.deserialize(codec.serialize(root))