当前位置: 首页 > article >正文

LeetCode hot 热题100 二叉树的层序遍历

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) { 
        // 定义一个返回值 `ans`,用于存储按层次遍历的结果。
        // 返回值类型是一个二维数组,其中每一行表示二叉树的某一层节点值。
        
        queue<TreeNode*> q; 
        // 定义一个队列 `q`,用于辅助层次遍历。
        // 队列中存储待处理的节点,先进先出保证按层次依次处理。

        if (root != nullptr) q.push(root); 
        // 如果根节点不为空,将根节点入队,作为遍历的起点。

        vector<vector<int>> ans; 
        // 定义最终结果数组,用于保存每一层的节点值。

        while (!q.empty()) { 
            // 当队列不为空时,表示还有节点需要处理。
            // 逐层遍历二叉树,直到队列为空为止。

            int n = q.size(); 
            // 获取当前队列的大小 `n`,表示当前层节点的数量。

            vector<int> v; 
            // 定义一个临时数组 `v`,用于保存当前层的节点值。

            for (int i = 0; i < n; i++) { 
                // 遍历当前层的所有节点。
                
                TreeNode* node = q.front(); 
                // 取出队首节点进行处理。

                v.push_back(node->val); 
                // 将当前节点的值加入到临时数组 `v` 中。

                q.pop(); 
                // 处理完队首节点后,将其从队列中移除。

                if (node->left) q.push(node->left); 
                // 如果当前节点有左子节点,则将其左子节点加入队列。

                if (node->right) q.push(node->right); 
                // 如果当前节点有右子节点,则将其右子节点加入队列。
            }

            ans.push_back(v); 
            // 将当前层的所有节点值保存到结果数组中。
        }

        return ans; 
        // 返回最终的结果数组。
    }
};

详细思路

1. 目标

使用层次遍历(Breadth-First Search,BFS)按层收集二叉树中每层的节点值,并将其存储到一个二维数组中。

2. 方法

使用队列实现 BFS,队列中的每个节点表示待处理的节点。

3. 步骤

1. 如果树为空(root == nullptr),直接返回空的二维数组。

2. 创建一个队列,并将根节点入队。

3. 进入循环,当队列不为空时:

• 获取当前队列的大小 n,表示当前层的节点数量。

• 遍历 n 个节点:

• 取出队首节点,访问其值并存储到当前层的结果数组中。

• 如果该节点有左子节点,将其左子节点入队。

• 如果该节点有右子节点,将其右子节点入队。

• 将当前层的节点值数组保存到最终结果中。

4. 队列为空时,所有节点已处理完,返回结果数组。

运行过程

假设输入如下二叉树:

         1

       /   \

      2     3

     / \   / \

    4   5 6   7

1. 初始状态

• 队列:[1]

• 结果:[]

2. 第一层

• 队列大小:1

• 处理节点:1

• 队列:[2, 3](将左右子节点 2 和 3 入队)

• 当前层结果:[1]

• 结果:[[1]]

3. 第二层

• 队列大小:2

• 处理节点:2

• 队列:[3, 4, 5](将左右子节点 4 和 5 入队)

• 处理节点:3

• 队列:[4, 5, 6, 7](将左右子节点 6 和 7 入队)

• 当前层结果:[2, 3]

• 结果:[[1], [2, 3]]

4. 第三层

• 队列大小:4

• 处理节点:4, 5, 6, 7

• 队列:[](无子节点入队)

• 当前层结果:[4, 5, 6, 7]

• 结果:[[1], [2, 3], [4, 5, 6, 7]]

5. 结束:队列为空,返回结果。

复杂度分析

1. 时间复杂度

• 每个节点进队和出队一次,总操作次数与节点数量 成正比。

时间复杂度:O(n)

2. 空间复杂度

• 队列在最坏情况下存储当前层的所有节点,最大值为树的宽度。

空间复杂度:O(w),其中 为二叉树的最大宽度。


http://www.kler.cn/a/519785.html

相关文章:

  • ollama部署及实践记录,虚拟环境,pycharm等
  • 树莓派安装步骤
  • 【win11】解决msrdc.exe窗口启动导致周期性失去焦点
  • 分布式微服务系统简述
  • 基于微信小程序的英语学习交流平台设计与实现(LW+源码+讲解)
  • 2025年新开局!谁在引领汽车AI风潮?
  • C语言精粹:深入探索字符串函数
  • C++11新特性之auto与decltype(总结)
  • Java 基础知识
  • zyNo.17(Web题型总结3)
  • STM32 GPIO配置 点亮LED灯
  • macOS使用LLVM官方发布的tar.xz来安装Clang编译器
  • pycharm 运行远程环境问题 Error:Failed to prepare environment.
  • 【Python・机器学习】多元回归模型(原理及代码)
  • Git上传了秘钥如何彻底修改包括历史记录【从安装到实战详细版】
  • Kafka 如何实现高性能
  • 【AI日记】25.01.25
  • 【C++总览】
  • Fossil源码在Windows下编译
  • Kafka运维宝典 (二)- kafka 查看kafka的运行状态、broker.id不一致导致启动失败问题、topic消息积压量告警监控脚本