小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
问题描述:
给你一颗二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例: 二叉树:[3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回其层序遍历结果:[ [3],[9,20],[15,7]]
分析问题
在开始之前,我们这里先来回顾一下什么是BFS(广度优先搜索)和DFS(深度优先搜索)。
- BFS:广度优先搜索是从图中一个未访问的顶点 V 开始,先遍历这个节点的相邻节点,再依次遍历每个相邻节点的相邻节点,一层层的搜索下去。
- DFS:深度优先搜索是从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底...,不断递归重复此过程,直到所有的顶点都遍历完成,它的特点是不撞南墙不回头,先走完一条路,再换一条路继续走。
下面我们来分别看一下代码实现。
DFS遍历:
def dfs(root):
if not root:
return
dfs(root.left)
dfs(root.right)
BFS遍历:
def bfs(root):
res = []
if root:
queue = [root]
while queue:
node=queue.pop()
res.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return res
下面我们来看一下题目,题目要求是按照层序遍历二叉树。那什么是层序遍历呢,简单来说,就是将二叉树分层,然后对每一层按照从左到右的顺序进行遍历。
看到这里,你有没有发现它和BFS的遍历顺序是一样的。我们可以直接使用BFS算法得出层序遍历的结果。这里需要注意一下,层序遍历和BFS遍历输出的结果是有点区别的。层序遍历要求我们需要区分每一层,即输出一个二维数组。而BFS遍历输出的结果是一维数组,是没办法区分是哪一层的,所以,我们需要对BFS代码稍微修改一下。
def bfs(root):
if not root:
return []
res = []
queue = []
queue.append(root)
while queue:
#该层的节点数量
size = len(queue)
tmp = []
#遍历把该层元素全部输出
while size:
node = queue.pop(0)
tmp.append(node.val)
size = size - 1
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
res.append(tmp)
return res
复杂度分析。
- 时间复杂度:二叉树中每个结点进队和出队各一次,所以时间复杂度为O(n)。
- 空间复杂度:队列中的元素不会超过n个,所以空间复杂度是O(n)。