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

力扣 102题 二叉树的层次遍历 记录

题目描述

给你二叉树的根节点 root ,返回其节点值的 层序遍历。(即逐层地,从左到右访问所有节点)。示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]示例 2:
输入:root = [1]
输出:[[1]]示例 3:
输入:root = []
输出:[]

思路

队列是一种先进先出(FIFO)的数据结构,非常适合于层序遍历,因为我们总是希望按照从树的上层到下层的顺序处理节点。

1、初始化阶段

  • 首先,检查传入的根节点是否为null。如果不为null,则将根节点加入到队列中。这个步骤是层序遍历的启动点,确保了从树的根节点开始遍历。

2、遍历阶段

  • 队列操作:使用一个队列来管理待处理的树节点。队列的先进先出特性保证了树的每一层都按照从左到右的顺序被处理。

  • 层级处理:

    • 循环开始时,首先检查队列是否为空。只要队列中还有节点,就继续遍历。
    • 对于每一层,首先获取队列的当前大小,这个大小表示该层的节点数量。
    • 初始化一个向量vec,用于存储当前层所有节点的值。
  • 节点处理:

    • 对当前层中的每个节点进行循环处理。循环中,每次从队列中取出队列前端的节点(当前节点),并从队列中移除它。
    • 将当前节点的值加入到当前层的向量vec中。
    • 检查当前节点是否有左子节点和右子节点。如果有,将这些子节点按顺序加入到队列中,以便在后续的层次中遍历它们。
  • 存储层次数据:

    • 完成当前层的节点处理后,将当前层的向量vec添加到最终结果的向量result中。这样,result逐步构建成一个包含所有层次数据的二维向量。

3、结束阶段

  • 当队列为空时,循环结束,此时所有树节点都已按层序遍历完毕。
  • 函数返回最终的二维向量result,这个向量现在包含了树的层序遍历结果,其中每个内部向量代表树的一层。

4、总体来看

  • 时间复杂度:每个节点恰好被访问一次,因此时间复杂度为O(n),其中n是树中的节点总数。
  • 空间复杂度:在最坏的情况下(完全二叉树),队列可能需要存储大约n/2个节点(最后一层的节点),因此空间复杂度也是O(n)。

完整代码

#include<iostream>
#include<queue>
#include<vector>using namespace std;struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), left(nullptr), right(nullptr) {}TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) { // 接受一个 TreeNode* 类型的参数,返回一个 vector<vector<int>> 类型的二维向量。queue<TreeNode*> que; // 用于按层序存储树中的节点,以便按顺序访问if(root != NULL) que.push(root);vector<vector<int>> result;while(!que.empty()){int size = que.size();vector<int> vec;for(int i = 0; i < size; i++){TreeNode* node = que.front(); que.pop();vec.push_back(node->val);if(node->left) que.push(node->left);if(node->right) que.push(node->right);}result.push_back(vec);}return result;}
};int main() {// 创建特定的二叉树:[3,9,20,null,null,15,7]TreeNode* root = new TreeNode(3);root->left = new TreeNode(9);root->right = new TreeNode(20);root->right->left = new TreeNode(15);root->right->right = new TreeNode(7);Solution solution;vector<vector<int>> result = solution.levelOrder(root);for (const vector<int>& level : result) {for (int val : level) {cout << val << " ";}cout << endl;}return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • CSS 中border-radius 属性
  • 学习并测试SqlSugar的单库事务功能
  • k8s二次开发-kubebuiler一键式生成deployment,svc,ingress
  • Lamp 小白菜鸟从入门到精通
  • Git 用法
  • blender和3dmax和maya和c4d比较
  • 各类专业技术的pdf电子书
  • SmartX 超融合 vs vSAN 8:数据库场景下的性能对比
  • 塔子哥的快乐值-美团2023笔试(codefun2000)
  • 静态路由技术
  • 内存卡损坏读不出怎么修复?内存卡数据恢复的7个方法请收好!
  • ubuntu23安装tensorRT步骤记录
  • linux(CentOS、Ubuntu)安装python3.12.2环境
  • Java 集合框架:HashMap 的介绍、使用、原理与源码解析
  • 在学习使用LabVIEW的过程中,需要注意哪些问题?
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 30天自制操作系统-2
  • Android Studio:GIT提交项目到远程仓库
  • express.js的介绍及使用
  • Intervention/image 图片处理扩展包的安装和使用
  • Java 最常见的 200+ 面试题:面试必备
  • JAVA多线程机制解析-volatilesynchronized
  • Just for fun——迅速写完快速排序
  • Redis字符串类型内部编码剖析
  • SOFAMosn配置模型
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 给Prometheus造假数据的方法
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 以太坊客户端Geth命令参数详解
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (12)目标检测_SSD基于pytorch搭建代码
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (第一天)包装对象、作用域、创建对象
  • (二)原生js案例之数码时钟计时
  • (南京观海微电子)——I3C协议介绍
  • (四) Graphivz 颜色选择
  • (转)http-server应用
  • (转)Sublime Text3配置Lua运行环境
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net web项目 调用webService
  • .net通过类组装数据转换为json并且传递给对方接口
  • .NET值类型变量“活”在哪?
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @RequestParam详解
  • @Slf4j idea标红Cannot resolve symbol ‘log‘
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [20190401]关于semtimedop函数调用.txt
  • [240727] Qt Creator 14 发布 | AMD 推迟 Ryzen 9000芯片发布