[LeetCode] 662. 二叉树最大宽度

news2024/11/20 15:25:19

题目描述:

给你一棵二叉树的根节点 root ,返回树的 最大宽度 。

树的 最大宽度 是所有层中最大的 宽度 。

每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这些 null 节点也计入长度。

题目数据保证答案将会在  32 位 带符号整数范围内。

示例 1:

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

示例 2:

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

示例 3:

输入:root = [1,3,2,5]
输出:2
解释:最大宽度出现在树的第 2 层,宽度为 2 (3,2) 。

提示:

  • 树中节点的数目范围是 [1, 3000]
  • -100 <= Node.val <= 100

题目链接:

. - 力扣(LeetCode)

解题主要思路:

一开始我是想用队列直接硬解,但是如果这条树每层只有最左节点和最右节点,会报错,因为内存占用太大了。后来想到,我们可以根据二叉树的特性,如果一个节点的下标为x,那么它的左右节点的下标分别为2x和2x+1。不过需要注意的是,我们需要用unsigned int来存下标的数值,因为c语言的数据存储可以看作是一个环形的存储,即使过了数据范围也无伤大雅,因为题目说了 “题目数据保证答案将会在  32 位 带符号整数范围内”,最右边节点的下标和最左边下标的差值在int的范围内,至于用unsigned是因为在leetcode中,带符号的数值类型超了范围会报错。

解题代码:

/**
 * Definition for a binary tree node.
 * 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:
    int widthOfBinaryTree(TreeNode* root) {
        // 数组模拟队列, 用unsigned int来计算,因为int过了数据范围会报错
        vector<pair<TreeNode*, unsigned int>> que;
        que.push_back(make_pair(root, 1));
        unsigned int ret = 0;
        while (que.size()) {
            vector<pair<TreeNode*, unsigned int>> tmp;
            auto& [x1, y1] = que[0];
            auto& [x2, y2] = que.back();
            ret = max(ret, y2-y1+1);
            // 将下一层入队列
            for (auto& [x, y] : que) {
                if (x->left) tmp.push_back(make_pair(x->left, 2*y));
                if (x->right) tmp.push_back(make_pair(x->right, 2*y+1));
            }
            que = tmp;
        }
        return ret;
    }
};

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

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

相关文章

【C语言刷力扣】2206.将数组划分成相等数对

题目&#xff1a; 解题思路&#xff1a; 题目中要求元素成数对出现&#xff0c;即每个元素出现偶数次。用哈希表存放每个数出现的次数&#xff0c;再循环查看每个数的次数是否位偶数。 typedef struct {int key;int count;UT_hash_handle hh; } hashEntry;bool divideArray(int…

IDEA下载安装

文章目录 1、下载安装包2、安装IDEA3、全局配置4、安装插件 1、下载安装包 IDEA官网下载最新IDEA。 上面的ULtimate是旗舰版&#xff0c;试用30天&#xff0c;之后是需要收费的&#xff0c;下面黑色区域的Community是社区版&#xff0c;功能不如旗舰版丰富&#xff0c;但是好在…

文件的二维码怎么做成?简单的3步生成二维码技巧

数字化时代的到来&#xff0c;用来将内容分享给其他人展示的方式也越来越多。其中二维码就是现在很流行的一种方式&#xff0c;将内容存入二维码后&#xff0c;其他人就可以扫描分享二维码来查看内容&#xff0c;那么文件生成二维码该怎么操作呢&#xff1f; 通过使用文件二维…

如何轻松实现Patreon订阅,获得独家内容

目录 1. 什么是Patreon&#xff1f; Patreon是一个非常流行的在线平台。 它支持内容创作者通过订阅的方式,直接从粉丝那里获取资金支持。无论是艺术家、音乐家,还是作家、视频制作人,都能在这里找到自己的粉丝群体。 简而言之,你可以通过订阅他们定期发布的独家内容,享受到更…

量子噪声与量子操作

由于量子不确定性和量子态的测量过程而引入的随机波动&#xff0c;量子噪声不可避免。 经典噪声 想象一下&#xff0c;一个比特存储在硬盘驱动器上&#xff0c; 它与普通计算机相连&#xff0c;该比特从状态0或1开始&#xff0c;经过长时间&#xff0c;散乱的磁场很可能会导致…

020 elasticsearch7.10.2 elasticsearch-head kibana安装

文章目录 全文检索流程ElasticSearch介绍ElasticSearch应用场景elasticsearch安装允许远程访问设置vm.max_map_count 的值 elasticsearch-head允许跨域 kibana 商品数量超千万&#xff0c;数据库无法使用索引 如何使用全文检索&#xff1a; 使用lucene&#xff0c;在java中唯一…

AI视频监控卫士:一键Docker简易安装,开源技术引领视频监控

AI视频监控卫士的主要应用场景&#xff1a; 我们决定开源的原因&#xff1a; 1. 灵活性与可定制性&#xff1a; 开源产品的代码对用户公开&#xff0c;允许开发者根据特定需求进行自定义和扩展。思通数科AI视频监控卫士作为开源项目&#xff0c;可以灵活适应不同企业或项目的需…

一些NLP代表性模型

&#xff08;一&#xff09;BERT 由Bidirectional Encoder Representations from Transformers的首字母组成&#xff0c;是encoder-only结构类型的代表。 模型分预训练和微调两步&#xff0c;预训练任务有两类&#xff1a;masked language model(MLM)、next sentence predict…

我作为TypeScript开发人员是如何学习Rust的

讲讲我作为TypeScript开发人员学习Rust的经验吧&#xff0c;希望对你有帮助 像许多开发人员一样&#xff0c;我通过专注于网络技术开始了我的编程生涯。我相信这是一个很好的起点&#xff0c;JavaScript&#xff0c;互联网的语言&#xff0c;以及许多&#xff0c;是一个令人难…

Axure原型设计秘籍:解锁高效设计与开发的宝藏工具

​ 在快速迭代的数字时代&#xff0c;原型设计成为了产品开发与用户体验优化的关键环节。Axure&#xff0c;作为一款备受推崇的原型设计工具&#xff0c;凭借其强大的功能、直观的界面和丰富的资源&#xff0c;成为了设计师和产品经理们的得力助手。本文将带你深入探索Axure的原…

JavaScript中的对象,常用内置对象和数据类型

一、对象 1.概念 什么是对象&#xff1f; 在JavaScript中&#xff0c;对象是一组无序的相关属性和方法集合&#xff0c;所有的事物都是对象&#xff0c;例如&#xff1a;字符串、数值、数组和函数等等。 对象是由属性和方法组成的。 属性&#xff1a;事物的特征&#xff0c;在…

使用CSS Flexbox创建简洁时间轴

使用CSS Flexbox创建简洁时间轴 在网页设计中,时间轴是一种常见且有效的方式来展示事件的顺序和进程。本文将介绍如何使用CSS Flexbox创建一个简洁优雅的时间轴,无需复杂的JavaScript代码。 基本HTML结构 首先,我们需要创建基本的HTML结构: html复制<div class"ti…

《CUDA编程》8.共享内存的合理使用

共享内存是 一种可被程序员直接操控的缓存&#xff0c;主要作用有两个&#xff1a; ①减少核函数中对全局内存的访 问次数&#xff0c;实现高效的线程块内部的通信 ②提高全局内存访问的合并度 将通过两个具体的例子阐明共享内存的合理使用&#xff0c;一个数组归约的例子和讨矩…

深入解析“低代码平台”与“零代码平台”:区别与应用场景

随着企业数字化转型的加速&#xff0c;低代码平台与零代码平台作为提升开发效率、降低IT成本的有效工具&#xff0c;正逐渐成为企业软件开发的新趋势。这两种平台虽然都旨在简化应用开发过程&#xff0c;但在功能、适用场景及用户群体上存在着显著差异。 低代码平台&#xff1a…

如何通过Chrome设置保护你的在线隐私

在当今数字时代&#xff0c;保护个人隐私和在线安全变得尤为重要。谷歌浏览器作为全球最受欢迎的网络浏览器之一&#xff0c;提供了多种功能来帮助用户保护自己的在线隐私。本教程将指导你如何通过谷歌浏览器设置来提高你的在线隐私保护水平。&#xff08;本文由https://www.li…

highcharts样式记录

图表设置 const rendChart (min, max) > {Highcharts.setOptions({global: { useUTC: false },});Highcharts.chart(hourly-chart, {chart: {spacingBottom: 0,marginLeft: 53,marginTop: 10,marginBottom: 0,marginRight: 13,style: {fontSize: 0.2rem,color: #363a44,li…

论文笔记 ICLR 2024 MogaNet: Multi-Order Gated Aggregation Network

配图中有2个分支&#xff0c;一个是subtract的输出和缩放因子&#xff08;γs&#xff09;相乘之后的结果&#xff0c;另一个是11卷积输出的结果&#xff0c;这两个分支的输出进行element-wise addition&#xff0c;这两个分支的输出分别代表什么&#xff1f; 为什么”增强局部…

1486. 数组异或操作

1486. 数组异或操作 题目含义&#xff1a;根据整数 n n n 和 s t a r t start start 构造一个数组&#xff0c;数组元素为 n u m s [ i ] 2 i s t a r t , i ∈ [ 0 , n − 1 ] nums[i] 2i start, i \in [0,n-1] nums[i]2istart,i∈[0,n−1]&#xff1b;最后返回这个数组…

电脑 WiFi 上网,开发板和电脑直连,如何才能让开发板也有网络

目录 问题 解决方法 1.设置电脑为WLAN共享模式 2、设置以太网IP 3、设置开发板IP及网关 4、测试 5、开发板重启之后会自动清空 /etc/resolv.conf文件中的内容问题解决 问题 电脑 WiFi 上网&#xff0c;开发板和电脑直连,如何才能让开发板也有网络 解决方法 1.设置电脑…