【C++】102.二叉树的层序遍历

news2024/10/7 15:24:42

题目描述

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

示例1:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

示例 2:

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

示例 3:

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

提示:

  • 树中节点数目在范围 [0, 2000]
  • -1000 <= Node.val <= 1000

思路分析

这个问题实际上可以只用一个队列就实现,只需要再增加一个变量levelSize,用来记录每一层的数据个数,然后再让这个队列一层一层的出去。之前的方法中,实际上队列并不是一层一层出去的,它有可能队列里面同时有两层的数据,我们以下面这个图来解释一下原因:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果有两层队列实现的话,3这个节点出来的时候,会让920这两个节点进入队列,而9这个节点出来的时候会让15这个节点进入队列,这个时候队列里面就同时有了第2层和第3层的数据。

所以我们想通过levelSize来达到一个目的:控制这个队列实现一层一层的出去。

那我们要怎么实现呢?我们仍然以刚才的图来进行分析:

3节点进入队列的时候,它的层数为1,由于它是根节点,所以它肯定只有一个,所以3就可以直接出队列。这个时候我们让levelSize进行自减操作它就变成了0,表示这一层已经出完了。

那么由于3节点出的时候会把920也带进来,也就是说当前层的节点全部出队列的时候一定是下一层的节点全部进入队列,这个时候我们将levelSize重新更新为第二层节点的数目也就是2,然后再进行出队列的操作:9节点出队列同时将15节点带进队列,然后levelSize自减变为120节点出队列同时将15节点和7节点带进队列,levelSize再自减变为0。这个时候就说明第二层也出完了。那么此时第三层都在队列里面所以我们再次更新levelSize的值为3,依次类推直到整棵树都被遍历完就实现了只用一个队列实现层序遍历。

那么根据以上的思路,我们就可以写出下面的代码:

完整代码

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*> q;
        int levelSize = 0;
        if (root)//如果根不为空,就入队列
        {
            q.push(root);
            levelSize = 1;
        }

        vector<vector<int>> vv;//用来存放一层一层出的节点
        while (!q.empty())//如果队列不等于空,就说明树还没有被遍历完
        {
            //通过levelSize控制一层一层出
            vector<int> v;//用来存放每一层的数据
            while (levelSize--)//levelSize是几循环就执行几次,--levelSize表示的则是执行(levelSize - 1)次
            {
                TreeNode* front = q.front();//先取队头的数据
                q.pop();
                v.push_back(front->val);
                //进去的同时把该节点的下一层往队列里面带

                if (front->left)//左如果不为空就让左入队列
                    q.push(front->left);

                if (front->right)//右如果不为空就让右入队列
                    q.push(front->right);

            }
            //走到这里就说明当前层已经出完了,就把当前层所出的数据放到vv里面
            vv.push_back(v);
            //更新下一层的数据
            levelSize = q.size();
        }

        return vv;
    }
};

运行结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1494367.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

fatal: unable to access ‘***‘: OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 0解决方案

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 大家好&#xff0c;我是水滴~~ 本文主要介绍在从 GitHub 上克隆 stable-diffusion-webui 项目时出现的 fatal: unable to access https://github.com/AUTOMATIC1111/stable-diffusion-webui.…

报错:module ‘collections‘ has no attribute ‘Iterable‘

使用python 高版本&#xff0c;在使用collections遇到报错&#xff1a;module ‘collections’ has no attribute ‘Iterable’ 查了资料 在python3.9 之后collections.Iterable被弃用了。 添加修改语句 collections.Iterable collections.abc.Iterable

【C++】String常用的函数总结

目录 一、string的构造函数方式&#xff1a; 二、常用的大小/容量相关操作&#xff1a; 三、string的常用修改操作&#xff1a; 四、string的遍历&#xff1a; 五、string的任意位置插入 / 删除&#xff1a; 六&#xff1a;补充&#xff1a; 一、string的构造函数方式&a…

Redis的三种集群模式(图解)

主从复制模式 一个主节点和多个从节点。主节点提供写入和读取功能&#xff0c;但是从属节点只提供读取功能。 主从复制的数据同步过程如下&#xff1a; &#xff08;1&#xff09;首先主节点启动&#xff0c;然后从属节点启动&#xff0c;从属节点会连接主节点并发送SYNC命令以…

SpringCloud Alibaba 学习

一&#xff1a;SpringCloud Alibaba介绍 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服 务的必需组件&#xff0c;方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。 依托 Spring Cloud Alibaba&…

00X集——CAD vba 填充(hatch)及挖空

首先&#xff0c;画个椭圆&#xff0c;并填充&#xff0c;直接上代码&#xff1a; Sub 画椭圆填充() 2024年3月6日21:10:22 by qq443440204 Dim hat As AcadHatch 填充 Dim ell(0) As AcadEllipse 椭圆 Dim cent(0 To 2) As Double 椭圆中心点 Dim dd(0 To 2) As Double 椭圆长…

Android开发手册,android面试试题

前言 组件化是 保持整个 App 可持续地进行高质量开发的基础&#xff0c;近年来也是业界一直在积极探索和实践的方向&#xff0c;在深入理解组件化架构的过程中&#xff0c;将不断考验你的技术深度与广度&#xff1b;实践中我还参考了十几家技术团队的解决方案&#xff08;例如…

智能设备 app 设计 —— 蓝蓝 UI 设计公司

今天给大家推荐是智能设备app设计&#xff0c;随着智能设备的逐渐普及随之操作app也越来越多&#xff0c;希望能给大家带来灵感 #日常灵感 #创意设计#UI提升#ui设计#app #设计案例分享|#设计 #产品设计#产品设计#设计灵感 #B端产品经理 #ui #产品 #美工 #交互 #产品经理 #开发 …

android实战视频教程,细数Android开发者的艰辛历程

缘起 随着互联网企业的不断发展&#xff0c;产品项目中的模块越来越多&#xff0c;用户体验要求也越来越高&#xff0c;想实现小步快跑、快速迭代的目的越来越难&#xff0c;还有应用之间的互相调用等等问题&#xff0c;插件化技术应用而生。如果没有插件化技术&#xff0c;美…

64位Office API声明语句第116讲

跟我学VBA&#xff0c;我这里专注VBA, 授人以渔。我98年开始&#xff0c;从源码接触VBA已经20余年了&#xff0c;随着年龄的增长&#xff0c;越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友&#xff0c;都来学习VBA,利用VBA,起码可以提高…

Qt插件之输入法插件的构建和使用(一)

文章目录 输入法概述输入法插件实现及调用输入键盘搭建定义样式自定义按钮实现自定义可拖动标签数字符号键盘候选显示控件滑动控件手绘输入控件输入法概述 常见的输入法有三种形式: 1.系统级输入法 2.普通程序输入法 3.程序自带的输入法 系统级输入法就是咱们通常意义上的输入…

普中51单片机学习(AD转换)

AD转换 分辨率 ADC的分辨率是指使输出数字量变化一个相邻数码所需输入模拟电压的变化量。常用二进制的位数表示。例如12位ADC的分辨率就是12位&#xff0c;或者说分辨率为满刻度的1/(2^12)。 一个10V满刻度的12位ADC能分辨输入电压变化最小值是10V1/(2^12 )2.4mV。 量化误差 …

C++ 哈希表OJ

目录 1、1. 两数之和 2、面试题 01.02. 判定是否互为字符重排 3、217. 存在重复元素 4、 219. 存在重复元素 II 5、49. 字母异位词分组 频繁查找某一个数的时候可以使用哈希表&#xff0c;哈希表可以使用容器&#xff0c;也可以使用数组模拟&#xff0c;当元素是字符串中的字…

8、Linux驱动开发:驱动-读写接口实现(readwrite)

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…

npm 私服以及使用

在工作中&#xff0c;公司有很多内部的包并不希望发布到npm官网仓库&#xff0c;因为可能涉及到一些私有代码不能暴露。对于前端来讲&#xff0c;这时就可以选择在公司内网搭建npm私有仓库。当前比较主流的几种解决方案&#xff1a;verdaccio、nexus、cnpm。大家可以按照自己的…

MongoDB Helloworld For Window

1. 下载MongoDB Download MongoDB Community Server | MongoDB 2. 安装MongoDB 3. 创建DB. 4. 用java code 连接mongo. 做增删改查操作。 pom.xml <dependency><groupId>org.mongodb</groupId><artifactId>mongodb-driver-sync</artifactId>&…

Frida-Hook-Java层操作大全

附件下载 https://github.com/DERE-ad2001/Frida-Labs 前期准备 使用 jadx 进行逆向工程的基础知识。应具备理解 Java 代码的能力。具备编写小型 JavaScript 代码片段的能力。熟悉 adb。设备已 root。Frida环境配置 Hook&#xff08;Hooking&#xff09;简介 让我们从非常…

IPsec VPN协议框架

IPsec是IETF&#xff08;Internet Engineering Task Force&#xff09;制定的一组开放的网络安全协议。它并不是一个单独的协议&#xff0c;而是一系列为IP网络提供安全性的协议和服务的集合&#xff0c;包括认证头AH&#xff08;Authentication Header&#xff09;和封装安全载…

dolphinscheduler海豚调度(五)seatunnel案例

seatunnel作为新一代流行的数据集成工具&#xff0c;其功能非常强大且简单易用&#xff0c;今天演示一下如何通过dolphinscheduler创建并运行seatunnel任务 本次dolphinscheduler和seatunnel均部署在同一机器上的单机版本 1、环境配置 打开dolphinscheduler安装目录&#xf…

【Python】新手入门(6):变量与数据类型

【Python】新手入门&#xff08;6&#xff09;&#xff1a;变量与数据类型 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448…