在问 · 算法题解

102. 二叉树的层序遍历

中等二叉树广度优先搜索力扣原题 ↗

题目描述

输入二叉树的根节点 root。按层把节点值收集起来:先是根所在的第一层,再往下一层一层处理。

每一层内部按从左往右的次序排列节点值,组成一个列表。返回所有层的列表,层的顺序从上到下。

树用层序数组表示,null 代表空位。空树返回空列表 []。

示例 1
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

解释:三层分别是 [3]、[9,20]、[15,7]。

示例 2
输入:root = [1]
输出:[[1]]

解释:只有根节点一层。

示例 3
输入:root = []
输出:[]

解释:空树没有任何层。

数据范围

  • 节点总数在 [0, 2000] 之间。
  • -1000 <= Node.val <= 1000

解题思路:广度优先搜索

队列做广度优先搜索;每轮先固定当前队列长度,只处理这一层。

为什么正确

每轮开始时队列恰好包含当前层的节点,顺序从左到右。

复杂度分析

时间 O(n),辅助队列 O(w),输出 O(n),w 为最大层宽。

易错点

不能边遍历队列边按动态长度决定本层范围,必须固定层大小。

参考代码

Python、Java、C++、Go、JavaScript、TypeScript 六种语言,逻辑一致。

from collections import deque

class Solution:
    def levelOrder(self, root):
        if not root:
            return []
        queue = deque([root])
        result = []
        while queue:
            level = []
            for _ in range(len(queue)):
                node = queue.popleft()
                level.append(node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            result.append(level)
        return result

载入编辑器,自己跑一遍 →

其他解法

广度优先搜索按层推进,最直观;深度优先搜索靠 depth 参数把节点放进对应层,空间随树高而不是层宽变化。

解法 2:深度优先搜索 时间 O(n),空间 O(h)

递归时带上当前深度 depth。第一次到达某个深度时,在结果里新建一层。按先左后右的顺序递归,把节点值追加到第 depth 层末尾,同层顺序自然是从左到右。

辅助空间取决于树高 h 而不是层宽 w,宽而矮的树更省空间。深链树递归很深,Python 需要调高递归深度。

import sys

class Solution:
    def levelOrder(self, root):
        sys.setrecursionlimit(10000)
        result = []
        def dfs(node, depth):
            if not node:
                return
            if depth == len(result):
                result.append([])
            result[depth].append(node.val)
            dfs(node.left, depth + 1)
            dfs(node.right, depth + 1)
        dfs(root, 0)
        return result

二叉树 专题的其他题目

查看 二叉树 全部题目 →