leetocde662. 二叉树最大宽度,面试必刷题,思路清晰,分点解析,附代码详解带你完全弄懂

leetocde662. 二叉树最大宽度

做此题之前可以先做一下二叉树的层序遍历。具体题目如下:

leetcode102二叉树的层序遍历

我也写过题解,可以先看看学习一下,如果会做层序遍历了,那么这题相对来说会简单很多。

具体题目

给你一棵二叉树的根节点 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.预分析

核心思想还是使用广度优先搜索(BFS)来遍历二叉树的每一层。
但这题不一样的是,它必须多保存一个数据,即二叉树的节点位置。

节点位置编号的重要性
在二叉树的层序遍历中,通常只需要访问每个节点一次。然而,为了计算宽度,即树的层间最大节点数,我们还需要知道每个节点在层中的位置。这就需要为每个节点分配一个唯一的位置编号,以反映其在层中的相对位置。

完全二叉树的位置编号策略
在完全二叉树中,每个节点的位置可以通过其在层中的索引来表示。对于任意节点,其左子节点的索引是当前节点索引的2倍,右子节点的索引是当前节点索引的2倍加1。这种索引策略允许我们快速地为子节点分配新的位置编号,而不需要额外的计算。

pair数据结构
由于既要保存二叉树节点,又要保存二叉树的位置,所以我们需要pair数据结构同时保存两个数据。

pair 是一个在 C++ 标准库中定义的模板类,用于存储两个元素的组合。它通常用于需要同时存储两个相关数据的场景
访问元素:pair 提供了 first 和 second 两个成员变量,分别用于存储和访问第一个和第二个元素。例如,pair<int, double> p(3, 4.5); 创建了一个 pair 对象 p,其中 p.first 是整数3,p.second 是浮点数4.5。

2.算法思路分析

输入检查:首先检查传入的二叉树根节点 root 是否为 nullptr。如果是,说明二叉树为空,其宽度为0,直接返回。

初始化变量:定义一个 unsigned long long 类型的变量 maxWidth 用于存储遍历过程中计算出的最大宽度。同时,定义一个队列 q,用于存储当前层的节点以及它们的位置编号。队列中的元素是一个 pair,包含一个 TreeNode* 类型的节点指针和一个 unsigned long long 类型的位置编号。

初始化队列:将根节点和其位置编号1作为队列的第一个元素。

BFS遍历:使用 while 循环,只要队列不为空,就继续执行。循环中,首先获取队列中的元素数量 size,这代表了当前层的节点数。然后,通过访问队列的前端和后端,获取当前层的最左边和最右边节点的位置编号 left 和 right。

计算宽度:使用 maxWidth 变量来记录到目前为止遍历到的最大宽度。在每次循环中,更新 maxWidth 为当前层宽度和 maxWidth 中较大值。当前层的宽度通过 (right - left + 1) 计算得出。

节点处理:在循环的内部,使用一个 for 循环来处理当前层的每个节点。对于队列中的每个元素,首先获取节点指针 node 和其位置编号 pos,然后从队列中移除该元素。接着,检查当前节点是否有左子节点和右子节点,如果有,计算它们的位置编号并将其加入队列。左子节点的位置编号是当前节点位置编号的2倍,右子节点的位置编号是当前节点位置编号的2倍加1。

循环结束:当队列为空时,表示已经遍历完所有层的节点,此时 maxWidth 中存储的就是二叉树的最大宽度。

3.算法特点分析

数据结构:算法使用了队列作为主要的数据结构,以实现BFS遍历。队列中的元素是包含节点指针和位置编号的 pair,这使得算法能够在每一层结束时快速确定最左边和最右边的节点。

时间复杂度:算法的时间复杂度为 O(n),其中 n 是二叉树中的节点数。这是因为每个节点恰好被访问一次。

空间复杂度:算法的空间复杂度为 O(w),其中 w 是二叉树的最大宽度。这是因为在任何给定时间,队列中最多会有 w 个节点。

位置编号:算法通过为每个节点分配一个位置编号来简化宽度的计算。这种方法避免了需要维护一个复杂的数据结构来跟踪每层的节点。

4.具体代码如下:


class Solution {
public:int widthOfBinaryTree(TreeNode* root) {if(root == nullptr)return 0;unsigned long long maxWidth = 0;queue<pair<TreeNode*,unsigned long long>> q;  // 使用队列保存每个节点和它对应的位置编号q.push(pair{root, 1});while(!q.empty()){int size = q.size();unsigned long long left = q.front().second;  // 当前层最左边节点的位置编号unsigned long long right = q.back().second;  // 当前层最右边节点的位置编号maxWidth = max(maxWidth, (right - left + 1));  // 计算当前层的宽度for(int i = 0; i < size; i++){TreeNode* node = q.front().first;unsigned long long pos = q.front().second;q.pop();if(node->left)q.push(pair{node->left, pos * 2});  // 左子节点的位置编号是当前节点的位置编号乘以2if(node->right)q.push(pair{node->right, pos * 2 + 1});  // 右子节点的位置编号是当前节点的位置编号乘以2加1}}return maxWidth;}
};

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

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

相关文章

Vue3+Element Plus 实现table表格中input的验证

实现效果 html部分 <template><div class"table"><el-form ref"tableFormRef" :model"form"><el-table :data"form.detailList"><el-table-column type"selection" width"55" align&…

Wonder3D 论文学习

论文链接&#xff1a;https://arxiv.org/abs/2310.15008 代码链接&#xff1a;https://github.com/xxlong0/Wonder3D 解决了什么问题&#xff1f; 随着扩散模型的提出&#xff0c;3D 生成领域取得了长足进步。从单张图片重建出 3D 几何是计算机图形学和 3D 视觉的基础任务&am…

【限免】16PAM、16PSK、16QAM、16CQAM星座图及误码率【附MATLAB代码】

​微信公众号&#xff1a;智能电磁频谱算法 QQ交流群&#xff1a;949444104 主要内容 MATLAB代码 % Parameters M 16; N 4; % Number of circles for CQAM SNR_dB 0:2:25; % Extended SNR range to reach higher values num_symbols 1e5; % Total number of symbols for s…

Linux学习笔记 --- 环境配置

在成功装载Ubuntu系统后我们需要设置其与windows系统的共享文件夹&#xff0c;按照以下步骤操作 设置完共享文件夹后在终端执行以下命令查看是否成功设置 此时下方出现设置的共享文件夹名称则为成功设置 如果未显示可以尝试进行重新安装VMware tools&#xff0c;步骤如下&…

git等常用工具以及cmake

一、将git中的代码克隆进电脑以及常用工具介绍 1.安装git 首先需要安装git sudo apt install git 注意一定要加--recursive&#xff0c;因为文件中有很多“引用文件“&#xff0c;即第三方文件&#xff08;库&#xff09;&#xff0c;加入该选项会将文件中包含的子模…

系统架构设计师②:操作系统

系统架构设计师②&#xff1a;操作系统 操作系统作用 ①管理系统的硬件、软件、数据资源 ②控制程序运行 ③人机之间的接口 ④应用软件与硬件之间的接口 进程管理 进程是程序在一个数据集合上运行的过程&#xff0c;它是系统进行资源分配和调度的一个独立单位。它由程序块、…

FastAPI(七十八)实战开发《在线课程学习系统》接口开发-- 评论

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 梳理下思路 1.判断是否登录 2.课程是否存在 3.如果是回复&#xff0c;查看回复是否存在 4.是否有权限 5.发起评论 首先新增pydantic模型 class Cour…

如何系统的学习C++和自动驾驶算法

给大家分享一下我的学习C和自动驾驶算法视频&#xff0c;收藏订阅都很高。打开下面的链接&#xff0c;就可以看到所有的合集了&#xff0c;订阅一下&#xff0c;下次就能找到了。 【C面试100问】第七十四问&#xff1a;STL中既然有了vector为什么还需要array STL中既然有了vec…

C#如何引用dll动态链接库文件的注释

1、dll动态库文件项目生成属性中要勾选“XML文档文件” 注意&#xff1a;XML文件的名字切勿修改。 2、添加引用时XML文件要与DLL文件在同一个目录下。 3、如果要是添加引用的时候XML不在相同目录下&#xff0c;之后又将XML文件复制到相同的目录下&#xff0c;需要删除引用&am…

VUE3学习第三篇:报错记录

1、在我整理好前端代码框架后&#xff0c;而且也启动好了对应的后台服务&#xff0c;访问页面&#xff0c;正常。 2、报错ReferenceError: defineModel is not defined 学到这里报错了 在vue网站的演练场&#xff0c;使用没问题 但是在我自己的代码里就出问题了 3、watchEffec…

企业公户验证API如何使用JAVA、Python、PHP语言进行应用

在纷繁复杂的金融与商业领域&#xff0c;确保每笔交易的安全与合规是至关重要的。而企业公户验证API&#xff0c;正是这样一位默默守护的数字卫士&#xff0c;它通过智能化的手段&#xff0c;简化了企业对公账户验证流程&#xff0c;让繁琐的审核变得快捷且可靠。 什么是企业公…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十七章 Linux中断实验

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

普元开源OBS仓颉版客户端,相较于Java实现桶创建接口平均响应时长缩小46.8%

关于作者&#xff1a;许飞锋&#xff0c;资深软件工程师&#xff0c;参与公司多个核心产品的设计与开发&#xff0c;对中间件相关技术及组件研究较多&#xff0c;对仓颉语言特性及神农框架理解较深入。 01‍ 关于OBS仓颉版客户端 1.1 组件定位 对象存储服务软件开发工具包&…

Canvas生成动画---显示一组彩色气泡

一、JS版本 <!--* Author: LYM* Date: 2024-07-26 13:51:47* LastEditors: LYM* LastEditTime: 2024-07-26 16:14:40* Description: Please set Description --> <!DOCTYPE html> <html> <head><title>canvas动态气泡</title><style&g…

Spring Boot的Web开发

目录 Spring Boot的Web开发 1.静态资源映射规则 第一种静态资源映射规则 2.enjoy模板引擎 3.springMVC 3.1请求处理 RequestMapping DeleteMapping 删除 PutMapping 修改 GetMapping 查询 PostMapping 新增 3.2参数绑定 一.支持数据类型: 3.3常用注解 一.Request…

Spark+实例解读

第一部分 Spark入门 学习教程&#xff1a;Spark 教程 | Spark 教程 Spark 集成了许多大数据工具&#xff0c;例如 Spark 可以处理任何 Hadoop 数据源&#xff0c;也能在 Hadoop 集群上执行。大数据业内有个共识认为&#xff0c;Spark 只是Hadoop MapReduce 的扩展&#xff08…

22 Python常用内置函数——枚举

enumerate() 函数用来枚举可迭代对象中的元素&#xff0c;返回可迭代的 enumerate 对象&#xff0c;其中每个元素都是包含索引和值的元组。 print(enumerate(abcd)) print(list(enumerate(abcd))) # 枚举字符串中的元素 print(list(enumerate([hello, world]))) # 枚举列表中…

【数据结构】:大厂面试经典链表OJ题目详解

反转链表 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 思路解透 本题就是通过不停地将最先的 head 节点位置的后一位插到最前面&#xff0c;完成链表的反转 本题需要两个节点变量 cur&#xff1a;其任务就是定位到原 head 节点位置的前一位&#xff0c;然后将自己…

百日筑基第二十八天-23种设计模式-行为型总汇

百日筑基第二十八天-23种设计模式-行为型总汇 文章目录 百日筑基第二十八天-23种设计模式-行为型总汇前言模板方法模式简介模板方式的特点模板方法模式结构类图模板方式模式案例分析模板方法模式应用源码分析模板方法模式的注意事项和细节 迭代器模式迭代器模式结构类图迭代器模…

git配置环境变量

一.找到git安装目录 打开此git安装目录下的bin文件&#xff0c;复制此文件路径 二.配置环境变量 2.1 右键点击此电脑的属性栏 2.2 点击高级系统配置 2.3 点击环境变量 2.4 按图中步骤进行配置 三.配置完成 win r 输入cmd打开终端 终端页面中输入 git --version 如图所示…