Java二叉树的最大宽度详解版
给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。
每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。
示例 1:
输入:
1/ \3 2/ \ \ 5 3 9
输出: 4
解释: 最大值出现在树的第 3 层,宽度为 4 (5,3,null,9)。
示例 2:
输入:
1/ 3 / \ 5 3
输出: 2
解释: 最大值出现在树的第 3 层,宽度为 2 (5,3)。
思路:
1.使用队列Deque将树中的每一层放入队列(层序遍历)
Deque才有getLast(),getFirst()方法(后序会用到)
2.修改节点的val值为树中的序列
左孩子:双亲节点序列X2 右孩子:双亲节点序列X2+1
3.每层的宽度=队列中最后一个节点.val - 队列中第一个节点.val + 1
getLast(),getFirst()方法
4.树最大宽度为每层宽度的最大值
/*** 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) {if(root == null) return 0;Deque<TreeNode> queue = new LinkedList<TreeNode>();//Deque才有getLast(),getFirst()方法int widthest = 0;//最大宽度TreeNode cur = null;root.val = 1;//重置root.val为root的序号queue.offer(root);//遍历每层while(!queue.isEmpty()){int width=queue.getLast().val-queue.getFirst().val+1;//每层的宽度widthest = (width > widthest) ? width : widthest;int size = queue.size();//一层的节点遍历while(size != 0){cur = queue.poll();if(cur.left != null) {cur.left.val = cur.val*2;//将node的val直接变成节点在书中的序列queue.offer(cur.left);}if(cur.right != null) {cur.right.val = cur.val*2 + 1;queue.offer(cur.right);}size--;}}return widthest;}
}
Java二叉树的最大宽度详解版相关推荐
- java 二叉树的最小深度详解
想了解更多数据结构以及算法题,可以关注微信公众号"数据结构和算法",每天一题为你精彩解答.也可以扫描下面的二维码关注 题目描述 给定一个二叉树,找出其最小深度. 最小深度是从根节点 ...
- Java Swing布局管理器(详解版)
在使用 Swing 向容器添加组件时,需要考虑组件的位置和大小.如果不使用布局管理器,则需要先在纸上画好各个组件的位置并计算组件间的距离,再向容器中添加.这样虽然能够灵活控制组件的位置,实现却非常麻烦 ...
- Java中的main()方法详解
源文作者:leizhimin 源文链接:http://lavasoft.blog.51cto.com/62575/53263 源文作者版权申明: 版权声明:原创作品,允许转载,转载时请务必以超链 ...
- 《Java和Android开发实战详解》——1.2节Java基础知识
本节书摘来自异步社区<Java和Android开发实战详解>一书中的第1章,第1.2节Java基础知识,作者 陈会安,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...
- Java多线程之volatile详解
Java多线程之volatile详解 目录: 什么是volatile? JMM内存模型之可见性 volatile三大特性之一:保证可见性 volatile三大特性之二:不保证原子性 volatile三 ...
- Java开发常见面试题详解(JVM)_2
Java开发常见面试题详解(JVM)_2 JVM 问题 详解 JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots link 你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认 ...
- Java 1.8 函数式编程详解
Java 1.8 函数式编程详解 文章目录 Java 1.8 函数式编程详解 一. 概述 1.1 java 8 新特性: 二. 函数式接口 2.1 函数式接口概述 2.2 Lambda表达式概述 2. ...
- Java并发编程最佳实例详解系列
Java并发编程最佳实例详解系列: Java并发编程(一)线程定义.状态和属性 Java并发编程(一)线程定义.状态和属性 线程是指程序在执行过程中,能够执行程序代码的一个执行单元.在java语言中, ...
- Java中的static关键字详解
** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...
- java中的进制输出转换_Java I/O : Java中的进制详解
作者:李强强 上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算.这一讲,泥瓦匠带你走进Java中的进制详解. 一.引子 在Java世界里,99%的工作都是处理这高层. ...
最新文章
- 在ESXi主机上关闭无响应的虚拟机
- RabbitMQ OS X下安装及常用命令-1
- MySQL流程控制函数-case结构
- python常用api_[原创]IDAPython常用API整理
- c/c++排坑(4) -- c/c++中返回局部变量
- X86汇编语言从实模式到保护模式12:存储器的保护
- JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)
- 修改FCKEditor实现将图片、文件等保存到数据库
- html中怎样设置放大功能,CSS如何设置图片放大效果?
- 魏武帝 太祖知不可匡正,遂不复献言
- SPSS联合Excel进行logistic回归亚组交互效应(交互作用)的可视化分析
- FPGA_Verilog学习之旅(2)---浅谈VGA
- 高琪老师(零基础初学入门)J20飞机项目飞机爆炸轮播图片
- Create user中采用externally操作系统认证方式详解
- 杭电oj 2081 手机短号(C++)
- 2020下半年新机最新消息_2020下半年3款重磅新机:三星Note20被吹爆,华为Mate40差点意思...
- 超赞!编译器和解释器的异同,瞬间明白了
- 【目标检测】FPN(Feature Pyramid Network)
- 回归和分类模型性能评估指标MSE,MAE,PR,ROC,AUC
- 数据库表内导入txt