二叉树的层序遍历

1,203 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

问题描述:

给你一颗二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

示例: 二叉树:[3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

返回其层序遍历结果:[ [3],[9,20],[15,7]]

分析问题

在开始之前,我们这里先来回顾一下什么是BFS(广度优先搜索)和DFS(深度优先搜索)。

  1. BFS:广度优先搜索是从图中一个未访问的顶点 V 开始,先遍历这个节点的相邻节点,再依次遍历每个相邻节点的相邻节点,一层层的搜索下去。
  2. 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

复杂度分析。

  1. 时间复杂度:二叉树中每个结点进队和出队各一次,所以时间复杂度为O(n)。
  2. 空间复杂度:队列中的元素不会超过n个,所以空间复杂度是O(n)。