题目描述:
题解:
参考:力扣
二叉树的前 中 后序遍历对应的二叉树不唯一,完整表示二叉树需要把null空节点也记录。
二叉树的序列化:借助队列
1.创建一个队列queue,初始时只有root节点,创建一个list,初始为空,保存序列化结果。
2.每次取出队列中第一个节点node,判断node是否为空节点,如果不是则将node.val加入result,然后将node的左右子节点加入队列,如果node为空节点,则直接在result中添加null。
以题目示例中的二叉树为例:
1.初始时queue只包含跟节点1,queue=[1],result=[]
2.从queue中取出node=1,node不为空,将node.val加入result,左右子节点加入queue,queue=[2,3],result = [1]
3.queue = [3,None,None] result = [1,2]
4.queue = [None,None,4,5] result = [1,2,3]
5.queue=[None,4,5] result = [1,2,3,null],注意此时从queue中取出的第一个节点为None,所以只在result中添加null,不会再向queue中添加节点,所以最终结果中不会有多余的null。
6.queue=[4,5] result = [1,2,3,null,null]
7.queue = [5 None None] result = [1,2,3,null,null,4]
8.queue = [None None None None] result = [1,2,3,null,null,4,5]
最终结果[1,2,3,null,null,4,5,null,null,null,null]
二叉树的反序列化:借助队列
根据题目示例中的例子,序列化结果为vals=[1,2,3,null,null,4,5,null,null,null,null],对应到二叉树中,根节点为1,其左右子节点为2,3,序列中对应序号为1,2
1.创建一个队列queue,初始时只有根节点,表示当前处理到的节点。
2.初始化一个序列下标,从1开始。
3.取出队列中第一个节点node,i对应的如果不为空,则说明val=vals[i]的节点为node的左子节点,将node.left加入队列。i后移一位,同样如果vals[i]不为空,则对应node的右子节点,node.right加入队列。
class Codec: def serialize(self, root): if not root: return "[]" queue = collections.deque() queue.append(root) result = [] while queue: node = queue.popleft() if node != None: result.append(str(node.val)) queue.append(node.left) queue.append(node.right) else: result.append("null") return '[' + ','.join(result) + ']' def deserialize(self, data): if data == "[]": return vals = data[1:-1].split(',') root = TreeNode((int(vals[0]))) i = 1 queue = collections.deque() queue.append(root) while queue: node = queue.popleft() if vals[i] != "null": node.left = TreeNode(int(vals[i])) queue.append(node.left) i = i + 1 if vals[i] != "null": node.right = TreeNode(int(vals[i])) queue.append(node.right) i = i + 1 return root