题解
思路
代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Codec:
### 1129 层序遍历 BFS(116 ms,18.4 MB)
def serialize(self, root):
"""Encodes a tree to a single string.
:type root: TreeNode
:rtype: str
"""
# 若root为空,直接返回'[]'
if not root: return '[]'
res = []
deq = collections.deque() # 定义双端队列deq,并将root入队
deq.append(root)
# 双端队列deq非空时,说明还有节点,则进行循环
while deq:
# node先入先出
node = deq.popleft()
# 若node非空,首先记录元素值val,然后左、右子节点分别入队
if node:
res.append(str(node.val))
deq.append(node.left)
deq.append(node.right)
# 若node为空,则记录值null
else: res.append('null')
return '[' + ','.join(res) + ']' # 返回时需要返回字符串列表
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
# 若data为'[]',则直接返回
if data == '[]': return
vals = data[1: -1].split(',') # 注意:首先需要去掉头尾的[和],对中间的元素进行读取和判断操作
idx = 1 # vals中第0个元素定义为root根节点,则从第1个元素开始遍历
root = TreeNode(int(vals[0])) # vals中第0个元素定义为root根节点
deq = collections.deque() # 定义双端队列deq,并将root入队
deq.append(root)
# 双端队列deq非空时,说明还有节点,则进行循环
while deq:
# node先入先出
node = deq.popleft()
if vals[idx] != 'null':
node.left = TreeNode(int(vals[idx])) # 首先为当前节点赋予左子节点
deq.append(node.left) # 再将此左子节点加入双端队列deq中,为下一层节点赋予子节点做准备
idx += 1 # 指向data中下一个元素
if vals[idx] != 'null':
node.right = TreeNode(int(vals[idx])) # 首先为当前节点赋予右子节点
deq.append(node.right) # 再将此右子节点加入双端队列deq中,为下一层节点赋予子节点做准备
idx += 1 # 指向data中下一个元素
return root # 返回root
# Your Codec object will be instantiated and called as such:
# codec = Codec()
# codec.deserialize(codec.serialize(root))