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

【LeetCode每日一题】——662.二叉树最大宽度

文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目示例】
  • 六【题目提示】
  • 七【解题思路】
  • 八【时间频度】
  • 九【代码实现】
  • 十【提交结果】

一【题目类别】

  • 广度优先搜索

二【题目难度】

  • 中等

三【题目编号】

  • 662.二叉树最大宽度

四【题目描述】

  • 给你一棵二叉树的根节点 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

七【解题思路】

  • 其实这道题就是二叉树的层序遍历的变种
  • 值得注意的是需要利用完全二叉树的性质
    • 在完全二叉树中,可以将其节点存储到数组中,并且对于序号为i的节点(节点编号从1开始),其
      • 左子节点的序号为i * 2
      • 右子节点的序号为i * 2 + 1
    • 利用以上性质,我们可以将每一层的二叉树的节点编号,用编号值计算每一层的宽度
    • 当计算出每一层的宽度后,就可以计算得到整个二叉树的最大宽度
  • 具体细节请参考下面的代码

八【时间频度】

  • 时间复杂度: O ( n ) O(n) O(n) n n n为传入的二叉树的节点个数
  • 空间复杂度: O ( n ) O(n) O(n) n n n为传入的二叉树的节点个数

九【代码实现】

  1. Java语言版
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/class Solution {public int widthOfBinaryTree(TreeNode root) {// 最小宽度为1int res = 1;// 初始化队列,queue用于存储当前层节点List<Pair<TreeNode, Integer>> queue = new ArrayList<Pair<TreeNode, Integer>>();queue.add(new Pair<TreeNode, Integer>(root, 1));// 使用广度优先遍历算法计算二叉树的最大高度while (!queue.isEmpty()) {// temp用于存储下一层节点List<Pair<TreeNode, Integer>> temp = new ArrayList<Pair<TreeNode, Integer>>();for (Pair<TreeNode, Integer> pair : queue) {TreeNode node = pair.getKey();int index = pair.getValue();if (node.left != null) {temp.add(new Pair<TreeNode, Integer>(node.left, index * 2));}if (node.right != null) {temp.add(new Pair<TreeNode, Integer>(node.right, index * 2 + 1));}}// 计算二叉树的最大宽度res = Math.max(res, queue.get(queue.size() - 1).getValue() - queue.get(0).getValue() + 1);queue = temp;}// 返回结果return res;}
}
  1. Python语言版
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = rightclass Solution:def widthOfBinaryTree(self, root: Optional[TreeNode]) -> int:# 最小宽度为1res = 1# 初始化队列,queue用于存储当前层节点queue = [[root, 1]]# 使用广度优先遍历算法计算二叉树的最大高度while queue:# temp用于存储下一层节点temp = []for node, index in queue:if node.left:temp.append([node.left, index * 2])if node.right:temp.append([node.right, index * 2 + 1])# 计算二叉树的最大宽度res = max(res, queue[-1][1] - queue[0][1] + 1)queue = temp# 返回结果return res
  1. C语言版
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/// 节点最多3000个
#define MAX_NODE_SIZE 3000// 比较大小
#define MAX(a, b) ((a) > (b) ? (a) : (b));// 利用完全二叉树的性质存储二叉树,node保留了节点的左右子树的关系,index记录节点(在数组中)的位置(索引)
typedef struct
{struct TreeNode* node;unsigned long long index;
} levelNode;int widthOfBinaryTree(struct TreeNode* root)
{// 最小宽度为1unsigned long long res = 1;// 初始化队列,queue用于存储当前层节点,temp用于存储下一层节点levelNode* queue = (levelNode*)malloc(sizeof(levelNode) * MAX_NODE_SIZE);levelNode* temp = (levelNode*)malloc(sizeof(levelNode) * MAX_NODE_SIZE);int queueSize = 0;int tempSize = 0;// 根节点入队列queue[queueSize].node = root;queue[queueSize++].index = 1LL;// 使用广度优先遍历算法计算二叉树的最大宽度while (queueSize > 0){// 将当前节点的所有下一层节点按照完全二叉树的索引值存储tempSize = 0;for (int i = 0; i < queueSize; i++){if (queue[i].node->left){temp[tempSize].node = queue[i].node->left;temp[tempSize++].index = queue[i].index * 2;}if (queue[i].node->right){temp[tempSize].node = queue[i].node->right;temp[tempSize++].index = queue[i].index * 2 + 1;} }// 计算二叉树的最大宽度res = MAX(res, queue[queueSize - 1].index - queue[0].index + 1);// 将存储当前层节点信息的队列重新赋值为存储好的下一层节点的信息队列queueSize = tempSize;levelNode* change = queue;queue = temp;temp = change;}// 返回结果return res;
}

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. Python语言版
    在这里插入图片描述

  3. C语言版
    在这里插入图片描述

相关文章:

【LeetCode每日一题】——662.二叉树最大宽度

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 广度优先搜索 二【题目难度】 中等 三【题目编号】 662.二叉树最大宽度 四【题目描述】 给…...

第二十三节、血量更新逻辑的实现

一、创建代码 引入命名空间 using UnityEngine.UI; 调用UI必须有这个代码 二、ScriptObject类 1、是一个持久化存储文件的类型 接收所有的事件方法 先继承SO类&#xff0c;然后创建项目菜单 2、进行订阅 放入事件类&#xff0c;关联代码&#xff0c;即可进行广播 传递给这…...

Spring Authorization Server 认证服务器搭建

Spring Authorization Server实现了oauth2和oidc,最近有了解相关技术的需求,所以就尝试着进行了基本的环境搭建和技术测试,目前只测试了授权码模式,做一个记录,后续需要用时方便查找和参考。 1. 版本要求 Spring Authorization Server 版本:1.3.1 JDK 版本:17 Spring B…...

秋招突击——8/15——知识补充——垃圾回收机制

文章目录 引言正文指针引用可达性分析算法垃圾回收算法标记清除算法标记整理算法复制分代收集 垃圾收集器Serial收集器ParNew并行收集器Parallel Scavenge吞吐量优先收集器Serial Old老年代收集器Parallel old收集器CMS收集器G1收集器&#xff08;Garbage First垃圾优先&#x…...

【iOS】UITableViewCell的重用问题解决方法

我自己在实验中对cell的重用总结如下&#xff1a; 非自定义Cell和非自定义cell的复用情况一样&#xff1a; 第一次加载创建tableView的时候&#xff0c;是屏幕上最多也显示几行cell就先创建几个cell&#xff0c;此时复用池里什么都没有开始下滑tableView&#xff0c;刚开始滑…...

开发一个微信小程序商城需要哪些技术栈

开发一个小程序商城需要掌握以下技术栈&#xff1a;‌ 前端技术&#xff1a;‌包括HTML、‌CSS和JavaScript&#xff0c;‌用于定义商城的页面结构、‌样式设计和交互功能。‌ 微信小程序专用技术&#xff1a;‌如WXML、‌WXSS、‌JavaScript和JSON&#xff0c;‌用于描述小程…...

望繁信科技荣膺上海市浦东新区博士后创新实践基地称号

近日&#xff0c;上海望繁信科技有限公司&#xff08;简称“望繁信科技”&#xff09;凭借在大数据流程智能领域的卓越表现&#xff0c;成功入选上海市浦东新区博士后创新实践基地。这一荣誉不仅是对望繁信科技创新能力和技术实力的高度认可&#xff0c;也标志着公司在推动产学…...

Nginx--代理与负载均衡(扩展nginx配置7层协议及4层协议方法、会话保持)

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、代理原理 1、反向代理产生的背景 单个服务器的处理客户端&#xff08;用户&#xff09;请求能力有一个极限&#xff0c;当接入请求过多时&#…...

Ubuntu20.4 系统安装后无wifi图标

0. 问题排查 1.检查 BIOS 设置: 有时候&#xff0c;无线网卡可能在 BIOS 中被禁用。重启电脑&#xff0c;进入 BIOS 设置&#xff0c;确保无线网卡选项是启用的。 2.检查硬件开关: 检查您的笔记本电脑是否有物理开关或键盘快捷键来启用或禁用无线网卡。 3.在软件更新中切换…...

牛客网SQL进阶135 :每个6/7级用户活跃情况

每个67级用户活跃情况_牛客题霸_牛客网 0 问题描述 基于用户信息表user_info、、试卷作答记录表exam_record、题目练习记录表practice_record&#xff0c;统计 每个6/7级用户总活跃月份数、2021年活跃天数、2021年试卷作答活跃天数、2021年答题活跃天数&#xff0c;结果 按照总…...

SQLite3使用接口写入二进制文件

使用接口的方式写入二进制文件 &#xff0c;有二种方案。 一、全部文件 一次性写下到数据中 使用sqlite3_bind_blob接口 FILE* fpfopen("user.bmp","rb"); iLenfread(buffer,1,65535,fp); fclose(fp);sqlite3_prepare(pDB,"insert into user values …...

在复杂的数据库架构中,如何优化 SQL 查询以提高性能和减少资源消耗?

在优化 SQL 查询以提高性能和减少资源消耗时&#xff0c;可以考虑以下几个方面&#xff1a; 使用索引&#xff1a;为经常被查询的列创建索引&#xff0c;可以大大加快查询速度。同时&#xff0c;避免过多的索引&#xff0c;因为过多的索引会增加写入操作的开销。 编写高效的查…...

【HarmonyOS】端云一体化初始化项目

简介 端云一体化开发是HarmonyOS对云端开发的支持、实现端云联动。云开发服务提供了云函数、云数据库、云存储等服务&#xff0c;可以使开发者专注于应用的业务逻辑开发&#xff0c;无需关注基础设施&#xff0c;例如&#xff1a;服务器、操作系统等问题。 因此&#xff0c;…...

LLM之KG:利用大语言模型(LLM)对文本语料提取概念和概念之间的语义关系进而实现自动构建知识图谱

LLM之KG:利用大语言模型(LLM)对文本语料提取概念和概念之间的语义关系进而实现自动构建知识图谱 目录 ML之KG:基于MovieLens电影评分数据集利用基于知识图谱的推荐算法(networkx+基于路径相似度的方法)实现对用户进行Top电影推荐案例 LLMs之AutoKG:《大型语言模型在知识图…...

Spring Security 6如何使用?

Spring Security 6 是一个功能强大且高度可定制的身份验证和访问控制框架&#xff0c;它专注于为基于Java的应用程序提供全面的安全解决方案。以下是对Spring Security 6的详细解析&#xff1a; 一、核心功能 身份验证&#xff08;Authentication&#xff09;&#xff1a; 验…...

PyTorch深度学习快速入门教程--学习笔记

目录 P4 PyCharm和Jupyter的对比 P5 PyTorch加载数据 P6 Dataset类代码实现 P7 Tensorboard 写日志 读取日志文件 Tensorboard 读图片 P10 Transforms使用 Transforms用途 常见的Transforms工具 P14 torchvision数据集使用 P15 Dataloader使用 P16 nn.Module模块使…...

SQLALchemy 分组过滤、子查询

SQLALchemy 分组过滤、子查询 分组和过滤(Group By Having)示例:使用ORM示例:使用SQLAlchemy Core子查询(Subquery)SQLAlchemy 是一个流行的 SQL 工具包和对象关系映射(ORM)库,用于 Python 应用程序。它允许你以 Pythonic 的方式使用 SQL 数据库,同时提供了强大的查询…...

华为od(D卷) 环中最长子串/字符成环找偶数LOX

文章目录 题目描述输入描述输出描述示例1示例2示例3思路代码 题目描述 给你一个字符串 s&#xff0c;字符串 s 首尾相连成一个环形&#xff0c;请你在环中找出 ‘l’、‘o’、‘x’ 字符都恰好出现了偶数次最长子字符串的长度。 输入描述 输入是一串小写的字母组成的字符串 …...

机器学习--常见算法总结

有监督学习算法 1. 线性回归算法 概念&#xff1a;线性回归是一种统计方法&#xff0c;用于预测一个变量&#xff08;因变量&#xff09;与一个或多个自变量&#xff08;特征变量&#xff09;之间的关系。目标是通过线性方程建立自变量和因变量之间的关系模型。 作用&#x…...

QT 网络聊天室简易版

视频:qt开发网络聊天w室软件3.4界面开发_哔哩哔哩_bilibili 目录 UI部分 设计稿图 放置控件 界面美化 拖动窗体 设置界面 网络部分 配置对话框 多项目结果和服务器端设计 客户端框架开发 UI部分 设计稿图 放置控件 界面美化 现在我们把窗体自带的标题栏给去了,用我们自…...

告别手动配置:用STM32CubeMX和Arduino库玩转ADS1115与STM32 ADC

告别手动配置&#xff1a;用STM32CubeMX和Arduino库玩转ADS1115与STM32 ADC 在嵌入式开发的世界里&#xff0c;ADC&#xff08;模数转换器&#xff09;就像一位不知疲倦的翻译官&#xff0c;将模拟世界的连续信号转换为数字世界能理解的离散数值。然而&#xff0c;传统的寄存器…...

RTKLIB源码解析(五)数据流融合:RINEX、RTCM、NMEA与接收机原始数据的协同处理

1. 多源GNSS数据流融合的核心挑战 在RTKLIB的实际应用中&#xff0c;处理来自不同数据源的GNSS观测数据时&#xff0c;开发者常会遇到三个关键问题&#xff1a;格式差异、时间基准不统一和数据质量参差不齐。以RINEX、RTCM、NMEA和接收机原始数据为例&#xff0c;这些数据源的…...

保姆级教程:用YOLOv8+PyQt5打造你的番茄成熟度检测桌面应用(附完整源码与数据集)

从零构建番茄成熟度检测桌面应用&#xff1a;YOLOv8与PyQt5深度整合实战 在农业智能化浪潮中&#xff0c;计算机视觉技术正逐步改变传统农业生产方式。以番茄种植为例&#xff0c;成熟度判断直接影响采摘效率和经济效益。本文将带您完整实现一个结合YOLOv8目标检测与PyQt5图形界…...

广东省内推荐靠谱的知识产权服务机构

在广东省&#xff0c;随着创新驱动发展战略的深入实施&#xff0c;知识产权的重要性日益凸显。无论是企业还是个人&#xff0c;都越来越重视知识产权的保护和运用。选择一家靠谱的知识产权服务机构至关重要&#xff0c;它能为客户提供专业、高效的服务&#xff0c;助力客户在知…...

DeOldify API速率限制:令牌桶算法实现每用户每小时1000次调用

DeOldify API速率限制&#xff1a;令牌桶算法实现每用户每小时1000次调用 1. 为什么需要API速率限制 在构建基于DeOldify的图像上色服务时&#xff0c;我们面临一个重要的技术挑战&#xff1a;如何公平合理地分配计算资源。深度学习模型推理需要消耗大量的GPU计算资源&#x…...

Vite - vite.config.js 的一些配置(base、resolve、server)

一、base 1、基本介绍 base 用于设置开发或生产环境服务的公共基础路径 类型&#xff1a;string默认值&#xff1a;/2、演示 部署在根路径 base: /// 例如&#xff0c;https://example.com/<!-- 此时生成的 HTML 中的资源引用会变为如下 --><script src"/assets/…...

CSS 嵌套语法最佳实践:从入门到精通的完整指南

CSS 嵌套语法最佳实践&#xff1a;从入门到精通的完整指南 CSS 是流动的韵律&#xff0c;JS 是叙事的节奏。而 CSS 嵌套&#xff0c;是让这份韵律更加优雅、结构更加清晰的魔法。 一、CSS 嵌套&#xff1a;现代样式表的革命 CSS 嵌套&#xff08;Nesting&#xff09;是 CSS 原…...

解决Windows远程桌面连接Ubuntu时xrdp闪退的配置技巧

1. 问题现象与排查思路 最近在帮同事配置Windows远程连接Ubuntu时遇到了一个典型问题&#xff1a;用Windows自带的远程桌面连接工具输入账号密码后&#xff0c;界面闪退无法进入桌面。这种情况在Ubuntu 18.04/20.04/22.04各版本中都可能出现&#xff0c;特别是使用GNOME桌面环…...

Spark 4.0 新特性Python Data Source API 快速上手

1. 什么是 Python Data Source API Python Data Source API 是 Spark 4.0 引入的新能力&#xff0c;它允许开发者在 Python 中直接实现自定义数据源和数据写出逻辑。换句话说&#xff0c;你可以像实现一个插件一样&#xff0c;为 Spark 增加新的读取来源和写出目标&#xff0c;…...

ECharts地图标注避坑指南:解决区域地图显示不全、标注错位等常见问题

ECharts地图标注避坑指南&#xff1a;解决区域地图显示不全、标注错位等常见问题 当你在使用ECharts绘制区域地图时&#xff0c;是否遇到过地图显示不全、标注点位置偏移、JSON数据格式错误等问题&#xff1f;这些问题看似简单&#xff0c;却可能耗费开发者大量时间排查。本文将…...