返回给定二叉树中一层最多的节点个数(仅使用队列实现)

2023-11-03

思路点拨:我们知道对二叉树实现层序遍历(也就是一层一层遍历)需要使用队列,而要找出节点最多的那一层,必然避不开要算出每一层节点的个数,那也就避不开层序遍历。

除此之外,我们还需要维护几个变量:
1:curend//当前层的最后一个节点
2:nextend//下一层的最后一个节点
3:curcount//当前层节点个数
4:maxcount//最多的节点个数

有了这几个变量,我们就可以完成这件事情,之后我们可以这样理解层序遍历:
层序遍历时删除的都是当前层的节点,入的都是下一层的节点

为了便于理解,先看一个例子感受一下:
在这里插入图片描述
对于上图,如何使用这几个变量和层序遍历完成任务呢?

1:先让1入队,curend设置为1,nextend设置为NULL
2:让1出队,curcount++(因为1为当前层节点),同时让2,3依次入队,每入一个设置nextend为入的节点,例如2入队,就设置nextend为2,之后3入队,就设置3为nextend,这样我们就能保证nextend确实存储的是下一层的最后一个节点,之后因为1为当前层的最后一个节点,所以这一层就遍历完了,需要更新maxcount(curcount小于maxcount的话不用管),并且将curcount归0(因为接下来是新的一层),最重要的是不要忘了curend也变了,变为原来的nextend,也就是3,nextend不需要改变,因为再入节点时它自己会变。
3:重复操作直到遍历结束

如果你已经初步理解了思路,我相信代码的实现是很简单的:
代码实现

int Find_Max_Floor(Node* head)
{
	int maxcount = -1;//最多的节点数
	Node* curend = head;//当前层的最后一个节点
	Node* nextend = NULL;//下一层的最后一个节点
	int curcount = 0;//当前层的节点数
	queue<Node*> Q;//用于层序遍历的队列
	Q.push(head);
	while (!Q.empty())//为空证明遍历结束
	{
		Node* tmp = Q.front();
		curcount++;
		//并将其子节点入队
		if (tmp->left != NULL)
		{
			Q.push(tmp->left);
			nextend = tmp->left;
		}
		if (tmp->right != NULL)
		{
			Q.push(tmp->right);
			nextend = tmp->right;
		}
		Q.pop();//删除当前层节点
		if (tmp == curend)//如果当前节点是当前层的最后一个,
		//更新maxcount和curend
		{
			if (curcount > maxcount)
				maxcount = curcount;
			curcount = 0;
			curend = nextend;
		}
	}
	return maxcount;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

返回给定二叉树中一层最多的节点个数(仅使用队列实现) 的相关文章

  • 2020.12.6-参加中国电子学会的青少年软件编程等级考试C语言5级(良好通过)

    Jensen今天参加了中国电子学会的青少年软件编程等级考试C语言的5级考试 目前C语言的5级是最高级别 需要将基本算法都学完的孩子来参加 基本算法包括递推 递归 贪心 分治 搜索 动态规划等 Jensen 两道题AC 其他两道题没有AC 但
  • 机器学习:马尔可夫模型

    后续遇到合适的案例会再补充 1 马尔可夫模型 马尔可夫模型 Markov Model MM 是一种统计模型 广泛应用在自然语言处理等领域中 1 1 数学定义 考虑一组随机变量序列 X X 0
  • Android获取手机联系人的基本信息(如姓名、电话、邮箱、备注)

    在做项目的过程中 需要获取我们手机通讯录联系人的基本信息 如姓名 电话 邮箱 备注 昵称 公司 职位 家庭电话等等信息 下面就是我总结的一些具体方法 1 首先读取联系人需要添加读取权限 6 0以上需要动态获取权限 1 1AndroidMan
  • go context用法详解

    转发自 作者kingeasternsun https studygolang com articles 10155 fr sidebar 本文主要基于官方文档Go Concurrency Patterns Context以及视频Advanc
  • SpringBoot+Vue校园学习成绩管理系统

    简介 本项目采用了基本的springboot vue设计的校园学习成绩管理系统 详情请看截图 经测试 本项目正常运行 本项目适用于Java毕业设计 课程设计学习参考等用途 项目描述 项目名称 SpringBoot Vue校园学习成绩管理系统
  • Hyperledger Fabric 带入门 Python 课程

    Hyperledger Fabric 带入门 Python 课程 Hyperledger Fabric 是一个开源的区块链框架 被广泛应用于企业级联盟链场景 Python 是一种高级编程语言 易于学习和使用 是区块链领域的热门语言之一 本文
  • 数字表达_金字塔神秘数字之谜!142857这组神奇的数字表达着什么含义

    在埃及金字塔内 发现一组看似平凡 但很神奇的数字 142857 这组数字背后隐藏着人类无法解释的谜团 有人说这组数字和汶川大地震的时间偶合 这组数字隐藏了灾难发生的预言之秘 这到底是有心人无端的揣测 还是严谨的科学推论 142857这组数字

随机推荐

  • c++ list 容器splice函数

    list 的splice函数主要是用来合并两个list splice是list中特有的拼接方法 splice实现了不需要拷贝的list合并 即可以在常数时间内从list的一个区域拼接到另一个list的一个区域 也就是说splice是一个常数
  • ParallelLoopState.Break与ParallelLoopState.Stop区别

    ParallelLoopState Break与ParallelLoopState Stop区别 Break和Stop都是为了停止循环的一种手段 不同之处在于 Break不立马结束循环 而是要等所有小于ParallelLoopState L
  • shell脚本中调用java程序,并传递参数的方法

    为了方便运行多个java程序 选择写了脚本进行统一管理 简单介绍下传输参数的方法 假设要向file java传输参数 step1 需要先生成 class文件 javac Test java step2 在脚本中定义参数 int a 5 do
  • 拉格朗日插值多项式

    1 拉格朗日插值多项式 首先给出 n次插值基函数定义 若 n 次 多 项 式 l j
  • windows驱动开发8:虚拟摄像头方案

    一 摄像头框架 在业务场景中 有许多是需要应用能够通过摄像头的方式来访问相关的音视频数据 比如美颜 摄像头多路复用 IP摄像头接入视频会议等 这些功能通过虚拟摄像头的方式来实现 是一个比较通用的解决方案 那么如何及选用哪种技术方案来开发虚拟
  • SAR成像系列:【12】层析合成孔径雷达(层析SAR,Tomographic SAR,TomoSAR)

    自1995年Knaell为解决曲线SAR成像结果中的强旁瓣问题 将二维计算机断层 Computed Tomography 成像技术扩展到三维空间 并通过投影切片理论和后向投影算法获得了雷达成像三维空间的点响应函数 从而为分析三维成像分辨率和
  • __declspec(dllimport)的理解

    declspec dllimport MSDN中说明 不使用 declspec dllimport 也能正确编译代码 但使用 declspec dllimport 使编译器可以生成更好的代码 编译器之所以能够生成更好的代码 是因为它可以确定
  • windows 查看端口占用

    1 开始 运行 cmd 调出命令窗口 2 输入命令 netstat ano 列出所有端口的情况 在列表中我们观察被占用的端口 比如是49153 首先找到它 3 查看被占用端口对应的PID 输入命令 netstat aon findstr 4
  • 【云计算网络安全】解析DDoS攻击:工作原理、识别和防御策略

    文章目录 一 前言 二 什么是 DDoS 攻击 三 DDoS 攻击的工作原理 四 如何识别 DDoS 攻击 五 常见的 DDoS 攻击有哪几类 5 1 应用程序层攻击 5 1 1 攻击目标 5 1 2 应用程序层攻击示例 5 1 3 HTT
  • 打穿sqli-labs靶场第五天(less-7)文件写入

    打穿sqli labs靶场第五天 less 7 文件写入 环境配置 该关卡需要用到文件写入操作 所以需要开启MySQL中的文件写入 进入MySQL下的bin目录 用命令行连接数据库 查看是否开启文件写入 show variables lik
  • 代码规范化的七大原则

    代码规范化的七大原则 代码规范化基本上有七大原则 体现在空行 空格 成对书写 缩进 对齐 代码行 注释七方面的书写规范上 空行 定义变量后要空行 尽可能在定义变量的同时初始化该变量 即遵循就近原则 如果变量的引用和定义相隔比较远 那么变量的
  • 物体移动--通过改变transform--鼠标控制

    鼠标控制物体移动 1 物体移动到鼠标点击处 2 物体跟随鼠标移动 分为三步 获取鼠标位置 转化为世界坐标 物体移动 private Vector3 mopos private Vector3 gamepos void Start 物体的世界
  • 2022年计算机二级MS Office高级应用复习题及答案

    1 IP地址是一串难以记忆的数字 人们用域名来代替它 完成IP地址和域名之间转换工作的是 A 服务器 A DNS B URL C UNIX D ISDN 2 用高级程序设计语言编写的程序称为源程序 它 D A 只能在专门的机器上运行 B 无
  • 华为OD机试真题- 找出通过车辆最多颜色【2023Q1】【JAVA、Python、C++】

    题目描述 在一个狭小的路口 每秒只能通过一辆车 假如车辆的颜色只有3种 找出N秒内经过的最多颜色的车辆数量 三种颜色编号为0 1 2 输入描述 第一行输入的是通过的车辆颜色信息 0 1 1 2 代表4秒钟通过的车辆颜色分别是0 1 1 2
  • Java 基于协同过滤实现插画交流平台中的插画信息推荐功能

    Mahout 介绍 Mahout 是 Apache Software Foundation ASF 旗下的一个开源项目 提供一些可扩展的机器学习领域经典算法的实现 旨在帮助开发人员更加方便快捷地创建智能应用程序 Mahout包含许多实现 包
  • MyBatis增删改查(步骤详细,由浅入深,适合初学者,只看这一篇就够了)

    MyBatis目录 java 后端框架 MyBatis的使用 1 mybatis基本使用 2 mybatis工具类的封装和实现增删改查 3 mybatis中主要类的介绍 4 nybatis实现动态代理 使用的是反射机制 重点掌握 5 myb
  • [Pikachu靶场实战系列]RCE(远程系统命令执行)

    RCE介绍 exec ping 可以输入一个ip地址 结果发现页面无回显 难道不应该回显Ping命令的结果吗 不过我们不管他 继续下一步 在ip后用 分割再输入一个ls命令 发现ls命令被执行了 说明开发者没有做严格的安全控制 没有想到我们
  • python pandas 处理并excel 插入一列新的数据

    python pandas 处理excel并插入一列新的数据 接到个需求是在表格里塞入一列新的数据 假如分页的数据 页 条数 我们这是200条 页 用的是pandas import pandas as pd path excel room
  • Elasticsearch硬核入门教程(2022最全)

    Java全能学习 面试指南 https javaxiaobear cn 1 Elasticsearch概述 1 什么是Elasticsearch The Elastic Stack 包括 Elasticsearch Kibana Beats
  • 返回给定二叉树中一层最多的节点个数(仅使用队列实现)

    思路点拨 我们知道对二叉树实现层序遍历 也就是一层一层遍历 需要使用队列 而要找出节点最多的那一层 必然避不开要算出每一层节点的个数 那也就避不开层序遍历 除此之外 我们还需要维护几个变量 1 curend 当前层的最后一个节点 2 nex