给你二叉树的根节点 root ,返回其节点值的层序遍历 。(即逐层地,从左到右访问所有节点)。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
示例 2:
输入:root = [1]
输出:[[1]]
示例 3:
输入:root = []
输出:[]
提示:
树中节点数目在范围 [0, 2000] 内
-1000 <= Node.val <= 1000
两种解法:
1.迭代法(广度优先遍历)
2.递归法(深度优先遍历)
广度优先遍历是按层层推进的方式,遍历每一层的节点。题目要求的是返回每一层的节点值,所以这题用广度优先来做非常合适。
如果想要扩展递归法,指路–>迭代+递归 多图演示 102.二叉树的层次遍历
本人比较懒,每题只掌握一种方法,苟过面试就好。
思路:
广度优先需要用队列作为辅助结构,我们先将根节点放到队列中,然后不断遍历队列。
首先拿出根节点,如果左子树/右子树不为空,就将他们放入队列中。第一遍处理完后,根节点已经从队列中拿走了,而根节点的两个孩子已放入队列中了,现在队列中就有两个节点 2 和 5。
第二次处理,会将 2 和 5 这两个节点从队列中拿走,然后再将 2 和 5 的子节点放入队列中,现在队列中就有三个节点 3,4,6。
我们把每层遍历到的节点都放入到一个结果集中,最后返回这个结果集就可以了。
时间复杂度: O(n)O(n)
空间复杂度:O(n)O(n)
代码实现:
class Solution(object):
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if not root:
return []
res = []
queue = [root] # queue存储了root的根节点
while queue:
# 获取当前队列的长度,这个长度相当于 当前这一层的节点个数
size = len(queue)
tmp = [] # 每一次while循环把tmp清空一遍
# 将队列中的元素都拿出来(也就是获取这一层的节点),放到临时list中
# 如果节点的左/右子树不为空,也放入队列中
for i in range(size):
r = queue.pop(0)
tmp.append(r.val)
if r.left:
queue.append(r.left)
if r.right:
queue.append(r.right)
# 将临时list加入最终返回结果中
res.append(tmp)
return res
注意:这里的queue和r存储的是树节点。tmp是普普通通的数组。
把变量print一下就知道内部是怎么变化的了:
class Solution(object):
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if not root:
return []
res = []
queue = [root] # queue存储了root的根节点
while queue:
# 获取当前队列的长度,这个长度相当于 当前这一层的节点个数
size = len(queue)
print('size:',size)
print('queue1:',queue)
tmp = [] # 每一次while循环把tmp清空一遍
# 将队列中的元素都拿出来(也就是获取这一层的节点),放到临时list中
# 如果节点的左/右子树不为空,也放入队列中
for i in range(size):
print('i:',i)
r = queue.pop(0)
tmp.append(r.val)
print('r:',r)
print('tmp:',tmp)
if r.left:
queue.append(r.left)
print('queue2:',queue)
if r.right:
queue.append(r.right)
print('queue3:',queue)
# 将临时list加入最终返回结果中
res.append(tmp)
print('res:',res)
return res
print的结果:
size: 1
queue1: [TreeNode{val: 3, left: TreeNode{val: 9, left: None, right: None}, right: TreeNode{val: 20, left: TreeNode{val: 15, left: None, right: None}, right: TreeNode{val: 7, left: None, right: None}}}]
i: 0
r: TreeNode{val: 3, left: TreeNode{val: 9, left: None, right: None}, right: TreeNode{val: 20, left: TreeNode{val: 15, left: None, right: None}, right: TreeNode{val: 7, left: None, right: None}}}
tmp: [3]
queue2: [TreeNode{val: 9, left: None, right: None}]
queue3: [TreeNode{val: 9, left: None, right: None}, TreeNode{val: 20, left: TreeNode{val: 15, left: None, right: None}, right: TreeNode{val: 7, left: None, right: None}}]
res: [[3]]
size: 2
queue1: [TreeNode{val: 9, left: None, right: None}, TreeNode{val: 20, left: TreeNode{val: 15, left: None, right: None}, right: TreeNode{val: 7, left: None, right: None}}]
i: 0
r: TreeNode{val: 9, left: None, right: None}
tmp: [9]
i: 1
r: TreeNode{val: 20, left: TreeNode{val: 15, left: None, right: None}, right: TreeNode{val: 7, left: None, right: None}}
tmp: [9, 20]
queue2: [TreeNode{val: 15, left: None, right: None}]
queue3: [TreeNode{val: 15, left: None, right: None}, TreeNode{val: 7, left: None, right: None}]
res: [[3], [9, 20]]
size: 2
queue1: [TreeNode{val: 15, left: None, right: None}, TreeNode{val: 7, left: None, right: None}]
i: 0
r: TreeNode{val: 15, left: None, right: None}
tmp: [15]
i: 1
r: TreeNode{val: 7, left: None, right: None}
tmp: [15, 7]
res: [[3], [9, 20], [15, 7]]