LeetCode662:二叉树最大宽度(二叉树非典型最大宽度,BFS层序遍历重编号)

题目

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

示例 1:
在这里插入图片描述

输入: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) 。

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

思路

可以看到本题要求的最大宽度不是寻常的一层节点实际含有的最大节点数,也不是将这棵树构造成满二叉树后,含有空节点在内的最大节点数。

而是某一层最左和最右的非空节点之间的最大长度,其中若含有空节点,空节点也计入长度。

我最先想到的是构造值为负值的空节点进栈,以某一层都为负值的空节点为判断条件判断是否结束遍历,否则会无休止地构造空节点下去。但这样空间时间消耗都很大,无论怎么样都过不了全部样例。随后想到了层序遍历的有序编号实际上可以反映他们的位置信息。

有序编号指的是:
root的编号=N
root.left的编号=2 * N
root.right的编号=2 * N + 1

这时,我们求出某一层最左节点的编号,和最右节点的编号,随后相减便是这层的宽度,然后求最大值即可。

public int widthOfBinaryTree(TreeNode root) {if(root==null) return 0;List<Integer> list = new ArrayList<>();List<List<Integer>> ans = new ArrayList<>();Queue<TreeNode> queue = new LinkedList<>();queue.add(root);root.val=1;while(!queue.isEmpty()){list = new ArrayList<>();int size = queue.size();for(int i=0;i<size;i++){TreeNode cur = queue.poll();list.add(cur.val);if(cur.left!=null) {queue.add(cur.left);cur.left.val=cur.val*2;}               if(cur.right!=null){queue.add(cur.right);cur.right.val=cur.val*2+1;}       }ans.add(list);}int max=-1;for(List<Integer> li:ans){int last = li.get(li.size()-1);int first = li.get(0);max=Math.max(max,last-first+1);}return max;}

2ms,击败54.54%使用 Java 的用户。
想要优化也是可以的。只不过为了不改变板子太多,我就没有优化。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【linux系统体验】-ubuntu简易折腾

ubuntu 一、终端美化二、桌面美化2.1 插件安装2.2 主题和图标2.3 美化配置 三、常用命令 以后看不看不重要&#xff0c;咱就是想记点儿东西。一、终端美化 安装oh my posh&#xff0c;参考链接&#xff1a;Linux 终端美化 1、安装字体 oh my posh美化工具可以使用合适的字体&a…

牢记这些,开发人员还不抢着修改你的需求,还要啥自行车

项目的修改和调整是开发过程里&#xff0c;非常正常的现象&#xff0c;为何有的技术团队效率高&#xff0c;执行力强&#xff0c;有的团队内耗严重&#xff0c;动作缓慢。贝格前端工场结合这多年的项目经验&#xff0c;给大家分享如何让技术人员快速的修改需求。 我一直的一个观…

【Java程序设计】【C00265】基于Springboot的地方废物回收机制管理系统(有论文)

基于Springboot的地方废物回收机制管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的地方废物回收机构管理系统 本系统分为管理员功能模块以及员工功能模块。 管理员功能模块&#xff1a;管理员登录系统后…

jsp计算机线上教学系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 计算机线上教学系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5…

蓝桥杯——第 5 场 小白入门赛(c++详解!!!)

文章目录 1 十二生肖基本思路&#xff1a; 2 欢迎参加福建省大学生程序设计竞赛基本思路&#xff1a;代码&#xff1a; 3 匹配二元组的数量基本思路&#xff1a;代码: 4 元素交换基本思路&#xff1a;代码&#xff1a; 5 下棋的贝贝基本思路&#xff1a;代码&#xff1a; 6 方程…

春运一票难求,候补抢票显威,如何设计一个候补订单系统?

春运一票难求&#xff0c;候补官方抢票 最近春节火车一票难求&#xff0c;12306系统的候补购票是一种官方支持的抢票方式。在首日票已售罄时&#xff0c;立即提交候补请求&#xff0c;系统会优先考虑候补乘客的需求。根据成功率灵活选择是否候补购票。 当旅客在12306网站购票&…

【程序设计竞赛】竞赛中的细节优化

必须强调下&#xff0c;以下的任意一种优化&#xff0c;都应该是在本身采用的算法没有任何问题情况下的“锦上添花”&#xff0c;而不是“雪中送炭”。 如果下面的说法存在误导&#xff0c;请专业大佬评论指正 读写优化 C读写优化——解除流绑定 在ACM里&#xff0c;经常出现…

Spring Cloud Gateway 网关路由

一、路由断言 路由断言就是判断路由转发的规则 二、路由过滤器 1. 路由过滤器可以实现对网关请求的处理&#xff0c;可以使用 Gateway 提供的&#xff0c;也可以自定义过滤器 2. 路由过滤器 GatewayFilter&#xff08;默认不生效&#xff0c;只有配置到路由后才会生效&#x…

《CSS 简易速速上手小册》第3章:CSS 响应式设计(2024 最新版)

文章目录 3.1 媒体查询基础&#xff1a;网页的智能眼镜3.1.1 基础知识3.1.2 重点案例&#xff1a;适应三种设备的响应式布局3.1.3 拓展案例 1&#xff1a;改变字体大小3.1.4 拓展案例 2&#xff1a;暗模式适配 3.2 响应式图片和视频&#xff1a;让内容自由呼吸3.2.1 基础知识3.…

线性代数的本质——1 向量

向量是线性代数中最为基础的概念。 何为向量&#xff1f; 从物理上看&#xff0c; 向量就是既有大小又有方向的量&#xff0c;只要这两者一定&#xff0c;就可以在空间中随便移动。 从计算机应用的角度看&#xff0c;向量和列表很接近&#xff0c;可以用来描述某对象的几个不同…

力扣刷题之旅:高阶篇(五)—— 网络流算法:最大流与最小割

力扣&#xff08;LeetCode&#xff09;是一个在线编程平台&#xff0c;主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目&#xff0c;以及它们的解题代码。 --点击进入刷题地址 引言 在算法领域中&#xff0c;网络流算法是一个重要且实用的工…

Python使用kruskal算法实现最小生成树

假如有多台计算机组成的局域网,不同计算机之间是使用光纤来连接的,如果把计算机看成是一个简单的节点,连接计算机的光纤看成是一条边,那这个局域网就可以抽象成为一个无向图: 添加图片注释,不超过 140 字(可选) 而对于这个图中的每个圆圈代表的是一个计算机,直线代表…