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

二叉树最大宽度

文章目录

  • 前言
  • 二叉树最大宽度
    • 1.题目解析
    • 2.算法原理
    • 3.代码编写
  • 总结


前言

二叉树最大宽度

1.题目解析

给你一棵二叉树的根节点 root ,返回树的 最大宽度 。
树的 最大宽度 是所有层中最大的 宽度 。
每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这些 null 节点也计入长度。
题目数据保证答案将会在 32 位 带符号整数范围内。

在这里插入图片描述
输入:root = [1,3,2,5,3,null,9]
输出:4
解释:最大宽度出现在树的第 3 层,宽度为 4 (5,3,null,9) 。

在这里插入图片描述
输入:root = [1,3,2,5,null,null,9,6,null,7]
输出:7
解释:最大宽度出现在树的第 4 层,宽度为 7 (6,null,null,null,null,null,7) 。

2.算法原理

思路一:

统计每一层的最大宽度,优先想到的就是层序遍历,把当前层节点全部存在队列中,利用队列的长度计算每一层的宽度就可以统计出最大宽度。

空节点也是现需要计算的,将空节点也存放在队列中。
但是在极端场景下,最左边一条长链,最右边一条长链,我们就需要几亿个节点,超出内存限制。
这个思路是错误的

思路二:

依旧是利⽤层序遍历,但是这⼀次队列⾥⾯不单单存结点信息,并且还存储当前结点如果在数组中存储所对应的下标(在我们学习数据结构 - 堆的时候,计算左右孩⼦的⽅式)这样我们计算每⼀层宽度的时候,⽆需考虑空节点,只需将当层结点的左右结点的下标相减再加 1 即可。

但是,这⾥有个细节问题:如果⼆叉树的层数⾮常恐怖的话,我们任何⼀种数据类型都不能存下下标
的值。但是没有问题,因为
• 我们数据的存储是⼀个环形的结构;
• 并且题⽬说明,数据的范围在 int 这个类型的最⼤值的范围之内,因此不会超出⼀圈;
• 因此,如果是求差值的话,我们⽆需考虑溢出的情况。

3.代码编写

class Solution {
public:int widthOfBinaryTree(TreeNode* root) {queue<pair<TreeNode*,unsigned int>>q;if(root==nullptr){return 0;}q.push({root,1});unsigned int maxlen=1;while(!q.empty()){int n=q.size();unsigned int begin=q.front().second;unsigned int end=q.back().second;maxlen=max(maxlen,end-begin+1);for(int i=0;i<n;i++){TreeNode*t=q.front().first;if(t->left){q.push({t->left,q.front().second*2});}if(t->right){q.push({t->right,q.front().second*2+1});}q.pop();}}return maxlen;}
};

总结

以上就是今天要讲的内容。希望对大家的学习有所帮助,仅供参考 如有错误请大佬指点我会尽快去改正 欢迎大家来评论~~ 😘 😘 😘

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 论文略读:Onthe Expressivity Role of LayerNorm in Transformers’ Attention
  • Spark MLlib机器学习
  • 安全高效海外仓系统:中小海外仓标准化管理的第一步
  • 开机自启动脚本配置
  • Java 期末复习 习题集
  • VS2022+Qt雕刻机单片机马达串口上位机控制系统
  • C++三大特性之继承,详细介绍
  • Yolov9比其他yolo版本的改进
  • 设计与实现完整的余额充值系统
  • MySQL之多表查询—列子查询
  • python后端结合uniapp与uview组件tabs,实现自定义导航按钮与小标签颜色控制
  • 谷歌google play上架
  • 淘宝扭蛋机小程序,扭蛋市场创新模式
  • 【recast-navigation-js】使用three.js辅助绘制Agent寻路路径
  • php质量工具系列之PHPCPD
  • 03Go 类型总结
  • 2017 前端面试准备 - 收藏集 - 掘金
  • ES6 学习笔记(一)let,const和解构赋值
  • IndexedDB
  • k8s 面向应用开发者的基础命令
  • Mysql5.6主从复制
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Redis中的lru算法实现
  • select2 取值 遍历 设置默认值
  • vue--为什么data属性必须是一个函数
  • 大快搜索数据爬虫技术实例安装教学篇
  • 当SetTimeout遇到了字符串
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 聊一聊前端的监控
  • 前端自动化解决方案
  • 如何合理的规划jvm性能调优
  • 事件委托的小应用
  • 小而合理的前端理论:rscss和rsjs
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • # Kafka_深入探秘者(2):kafka 生产者
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (规划)24届春招和25届暑假实习路线准备规划
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (实战篇)如何缓存数据
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • . Flume面试题
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .Net Core 微服务之Consul(三)-KV存储分布式锁
  • .NET Core 中的路径问题
  • .NET Core中的去虚
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net MySql
  • .NET 反射的使用
  • .NET 服务 ServiceController