leetcode102. 二叉树的层序遍历

一、题目描述:

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

二、输入输出实例:

示例 1:

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

示例 2:

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

示例 3:

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

三、思路讲解:

  • 创建一个队列,用来存储树节点的指针。这个队列会最多存储两层的树节点,所以我们需要一个变量来得知队列的前几个节点是上一层,从哪个节点开始是下一层。
  • 首先检查根节点是否为空。如果根节点为空,则没有节点需要遍历,直接返回空的结果向量。
  • 如果根节点不为空,将根节点加入队列,因为根节点的那一层必定只有一个节点,所以将sz初始化为1。
  • 使用一个 while 循环,只要队列不为空,就持续处理。
  • 在每一层的开始,初始化一个空向量 v 来存储该层的节点值。
  • 使用 sz 来控制内层while循环,sz为0表示当前层的所有节点都被处理。
  • 内层循环的作用是:从队列中取出一个节点,获取它的值并存储在当前层的结果向量 v 中。检查该节点的左子节点和右子节点,如果存在,则将它们加入队列,为下一层做准备。
  • 当前层的节点处理完毕后,将当前层的结果向量 v 加入最终结果向量 vv
  • 更新 sz 为队列中元素的数量,即下一层的节点数。
  • 当队列为空时,所有层的节点都已处理完毕,返回结果向量 vv

四、C++代码:

  • 包含注释的版本:
class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root){queue<TreeNode*> q;//创建一个队列,存储每一个树节点的指针int sz=0;//定义一个变量,用于统计当前层的节点数量if(root)//如果数存在{sz=1;//第一层只有一个节点,我们将sz设置为1q.push(root);//将根节点的指针添加到队列}vector<vector<int>> vv;//创建一个存放vector<int>类型的vectorwhile(!q.empty())//如果队列不为空,说明队列中仍有树节点需要处理{vector<int> v;//创建一个临时的vector存放当前层的每个节点的值while(sz--)//sz不为0,说明当前层仍然有节点需要处理{TreeNode* front=q.front();//设置一个树节点指针方便操作q.pop();//出栈队列第一个元素v.push_back(front->val);//将出栈的元素内部的值添加到vector中if(front->left)//处理左子树节点q.push(front->left);//如果节点不为空,就将节点的指针添加到队列if(front->right)q.push(front->right);}sz=q.size();//队列当前的大小,就是下一层节点数量vv.push_back(v);//将存放当前层元素的vector添加到总vector中}return vv;//返回总vector}
};
  • 去注释版本 :
class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root){queue<TreeNode*> q;size_t sz=0;if(root){sz=1;q.push(root);}vector<vector<int>> vv;while(!q.empty()){vector<int> v;while(sz--){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);}sz=q.size();vv.push_back(v);}return vv;}
};

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

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

相关文章

基于 Redis 实现分布式锁的全过程

前言 这一篇文章拖了有点久&#xff0c;虽然在项目中使用分布式锁的频率比较高&#xff0c;但整理成文章发布出来还是花了一点时间。在一些移动端、用户量大的互联网项目中&#xff0c;经常会使用到 Redis 分布式锁作为控制访问高并发的工具。 一、关于分布式锁 总结&#x…

【HDFS】处理状态为RECEIVING_BLOCK的增量块汇报

带着以下问题: RECEIVING_BLOCK状态的IBR,block的长度汇报上来有用么?BlockManager#processIncrementalBlockReport里,处理IBR,里面有一个case分支,专门处理RECEIVING_BLOCK状态的块。 case RECEIVING_BLOCK:// receving计数器++receiving++;// 第三个参数副本状态是RBWp…

20.Redis之缓存

1.什么是缓存&#xff1f; Redis 最主要的用途,三个方面:1.存储数据(内存数据库)2.缓存 【redis 最常用的场景】3.消息队列【很少见】 缓存 (cache) 是计算机中的⼀个经典的概念. 在很多场景中都会涉及到. 核⼼思路就是把⼀些常⽤的数据放到触⼿可及(访问速度更快)的地⽅, ⽅…

基础—SQL—DQL(数据查询语言)聚合函数

一、引言 一般情况下&#xff0c;我们在进行分组查询的时候&#xff0c;一般配合着聚合函数来进行操作&#xff0c;所以先了解和学习聚合函数再学习和操作分组查询。 二、DQL—聚合函数 1、介绍 聚合函数指的是讲一列数据作为一个整体&#xff0c;进行纵向的计算。 2、常见…

域内用户枚举和密码喷洒

一. 域内用户枚举原理和流量 1. 原理 在AS-REQ阶段客户端向AS发送用户名&#xff0c;cname字典存放用户名&#xff0c;AS对用户名进行验证&#xff0c;用户存在和不存在返回的数据包不一样。 不同之处主要是在返回数据包中的状态码不同&#xff0c;根据不同的状态码来区分账…

20分钟Angular框架快速入门

Angular框架快速入门可以按照以下步骤进行&#xff1a; 一、准备工作 安装Node.js&#xff1a;Angular依赖于Node.js进行开发&#xff0c;因此首先需要安装Node.js。确保安装的是最新稳定版本。 二、安装Angular CLI 打开命令行工具&#xff1a;在Windows上可以使用CMD或Pow…

数学建模 —— 人工神经网络(6)

目录 一、人工神经网络 1.1 人工神经网络结构 1.2 神经元/感知器 1.3 激活函数 1.3.1 sign函数 1.3.2 sigmoid函数&#xff08;Logistic函数&#xff09; 1.3.3 tanh双曲正切函数 1.3.4 ReLU函数 1.4 分类 二、BP人工神经网络 2.1 概述 2.2 处理过程 2.3 例题 2.…

Android Studio插件开发 - Dora SDK的IDE插件

IDE插件开发简介 Android Studio是一种常用的集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于开发Android应用程序。它提供了许多功能和工具&#xff0c;可以帮助开发人员更轻松地构建和调试Android应用程序。 如果你想开发Android Studio插件&#xff0c;以下是一…

移动系统编程-安装和运行Ionic应用程序 (Installation and Running Ionic Apps)

安装 (Installation) 假设您已经安装了Node.js和Angular&#xff0c;您可以使用以下命令安装Ionic&#xff1a; npm install -g ionic/cli您也可以不使用CLI安装Ionic&#xff0c;但如果您使用的是最新版本的Cordova&#xff0c;这样做可能会导致版本不匹配&#xff0c;不推荐…

基础技术-ELF系列(3)-libelf使用

成就更好的自己 本篇是基础技术系列中ELF相关技术的第三篇&#xff0c;也是计划中的最后一篇&#xff08;后续遇到问题可能还会有后续&#xff09;。本文将会以上一篇文章中提到的实际问题写一段Demo为例&#xff0c;着重讲解一下libelf库的基本使用。 没有看过之前文章的朋友…

【技术实操】银河高级服务器操作系统实例分享,数据库日志文件属主不对问题分析

1. 问题现象描述 2023 年 06 月 30 日在迁移数据库过程中&#xff0c;遇到数据库 crash 的缺陷&#xff0c;原因如下&#xff1a;在数据库启动时候生成的一组临时文件中&#xff0c;有 owner 为 root 的文件&#xff0c; 文件权限默认为 640&#xff0c; 当数据库需要使用的时…

「C系列」C 基本语法

文章目录 一、C 基本语法1. **程序结构**2. **数据类型**3. **变量声明**4. **运算符**6. **函数**7. **指针**8. **数组**9. **结构体和联合体**10. **预处理指令**11. **内存管理** 二、C 关键字1. 整体概览2. 具体关键字数据类型关键字控制流关键字其他关键字C11新增关键字总…

高速服务区智慧公厕管理系统引导屏UI界面展示

在现代社会&#xff0c;高速服务区作为人们出行途中的重要休憩场所&#xff0c;其各项设施的智能化水平也在不断提升。其中&#xff0c;智慧公厕管理系统的出现&#xff0c;为人们带来了更加便捷、舒适的如厕体验&#xff0c;而引导屏 UI 界面更是这一系统的重要展示窗口。 智慧…

mdk 编程入门:探索编程世界的神秘之旅

mdk 编程入门&#xff1a;探索编程世界的神秘之旅 在科技日新月异的今天&#xff0c;编程已成为一项不可或缺的技能。MDK编程作为其中的一员&#xff0c;以其独特的魅力和广泛的应用领域吸引着越来越多的初学者。那么&#xff0c;如何入门MDK编程呢&#xff1f;本文将带你走进…

Python | Leetcode Python题解之第126题单词接龙II

题目&#xff1a; 题解&#xff1a; class Solution:def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[List[str]]:ans []if endWord not in wordList:return anssize len(beginWord)cur_word_set {beginWord}ws set(wordList)# 用于…

MySQL开发教程和具体应用案例

一、MySQL开发教程 初识数据库 定义:数据仓库,安装在操作系统之上,用于存储和管理数据。 分类:关系型数据库(如MySQL、Oracle、SQL Server)和非关系型数据库(如Redis、MongoDB)。 SQL:结构化查询语言,用于管理和操作关系型数据库。 操作数据库 创建、修改、删除…

【LeetCode 637】二叉树的层平均值

1. 题目 2. 分析 没啥好说的&#xff0c;这题很简单&#xff0c;希望能在5min内搞定。遇到问题要快速排查&#xff0c;不要怀疑编译器。 3. 代码 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # …

nacos配置发布流程代码示例

在 Nacos 中发布配置通常不需要直接编写代码&#xff0c;而是通过 Nacos 的管理界面或者使用 Nacos 提供的客户端 SDK 来完成。不过&#xff0c;如果想要通过编程的方式来发布配置&#xff0c;可以使用 Nacos 的客户端 SDK。 以下是一个使用 Java 和 Nacos 客户端 SDK 发布配置…

如何在 Linux VPS 上自定义你的 Bash 提示符

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 在管理 Linux 服务器时,您将花费大量时间使用命令行。对于大多数人来说,这意味着与 Bash shell 一起花费大量时间。 虽然大多数发行版为用户和 root 提供了合理…

WPF Binding对象、数据校验、数据转换

在WinForm中&#xff0c;我们要想对控件赋值&#xff0c;需要在后台代码中拿到控件对象进行操作&#xff0c;这种赋值形式&#xff0c;从根本上是无法实现界面与逻辑分离的。 在WPF中&#xff0c;微软引入了Binding对象&#xff0c;通过Binding&#xff0c;我们可以直接将控件与…