0102.二叉树的层序遍历

难度:🟡 中等

标签广度优先搜索二叉树

链接102. 二叉树的层序遍历

题目描述

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

示例 1:

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

示例 2:

输入:root = [1]
输出:[1](./1.md)

示例 3:

输入:root = []
输出:[]

解题思路

核心思想

本题要求按层级顺序遍历二叉树,这正是 广度优先搜索(Breadth-First Search, BFS) 的典型应用。BFS 的核心是使用一个队列(Queue)来实现逐层探索。从根节点开始,我们先访问根节点,然后将其所有子节点加入队列,再依次从队列中取出节点进行访问,并将其子节点加入队列,如此循环往复,直到队列为空。

思路选择

使用队列实现广度优先搜索是解决此问题的最标准、最高效的思路。为了将每一层的节点值分组到不同的子数组中,我们可以在每一轮的遍历开始前,记录下当前队列中的节点数量 levelSize,这个数量就是当前层所包含的节点总数。然后,我们只对这 levelSize 个节点进行出队操作,从而确保每一轮循环处理的都是同一层的节点。

关键步骤

  1. 处理边界情况:如果根节点 root 为空,直接返回空数组 []

  2. 初始化:创建一个队列 queue 并将根节点 root 入队。创建一个结果数组 results 用于存放最终的层序遍历结果。

  3. 开始循环:当 queue 不为空时,持续进行层序遍历。

  4. 分层处理: a. 在循环的开始,获取当前 queue 的长度 levelSize。这代表了当前层级的节点总数。 b. 创建一个临时数组 currentLevel,用于存放当前层所有节点的值。 c. 启动一个内层循环,执行 levelSize 次。 d. 在内层循环中,从 queue 的头部取出一个节点(出队)。 e. 将该节点的值存入 currentLevel 数组。 f. 如果该节点有非空的左子节点,将其左子节点入队。 g. 如果该节点有非空的右子节点,将其右子节点入队。

  5. 存储层级结果:内层循环结束后,currentLevel 数组就包含了当前层所有的节点值。将其推入 results 数组。

  6. 返回结果:当外层 while 循环结束时(即队列为空),results 中就包含了完整的层序遍历结果,返回 results 即可。

代码实现

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 * this.val = (val===undefined ? 0 : val)
 * this.left = (left===undefined ? null : left)
 * this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
var levelOrder = function (root) {
    if (root === null) {
        return [];
    }

    const queue = [root]; // 初始化队列,并将根节点入队
    const results = [];   // 存放最终结果

    while (queue.length > 0) {
        const levelSize = queue.length; // 当前层的节点数
        const currentLevel = [];      // 存放当前层节点值的数组

        for (let i = 0; i < levelSize; i++) {
            const node = queue.shift(); // 节点出队
            currentLevel.push(node.val);

            // 将下一层的节点入队
            if (node.left !== null) {
                queue.push(node.left);
            }
            if (node.right !== null) {
                queue.push(node.right);
            }
        }
        results.push(currentLevel); // 将当前层的结果推入最终结果集
    }

    return results;
};

复杂度分析

  • 时间复杂度O(n) 其中 n 是树中节点的总数。每个节点都会被访问(入队和出队)一次。

  • 空间复杂度O(w) 其中 w 是树的最大宽度。空间复杂度主要取决于队列中存储的节点数。在最坏的情况下(一个完美的完全二叉树),队列中最多会存储最后一层的所有节点,约为 n/2 个,因此空间复杂度可以认为是 O(n)。

相关题目

总结

本题是二叉树广度优先搜索(BFS)的模板题。其核心是利用队列“先进先出”的特性来保证按层级顺序访问节点。通过在每一轮循环开始时固定当前层的节点数量,可以巧妙地将不同层的节点分离开来,这是处理层序遍历问题的一个通用且高效的技巧。

Copyright © Jun 2025 all right reserved,powered by Gitbook该文件修订时间: 2025-07-03 17:35:08

results matching ""

    No results matching ""

    results matching ""

      No results matching ""