给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(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二叉树的最大宽度详解版相关推荐

  1. java 二叉树的最小深度详解

    想了解更多数据结构以及算法题,可以关注微信公众号"数据结构和算法",每天一题为你精彩解答.也可以扫描下面的二维码关注 题目描述 给定一个二叉树,找出其最小深度. 最小深度是从根节点 ...

  2. Java Swing布局管理器(详解版)

    在使用 Swing 向容器添加组件时,需要考虑组件的位置和大小.如果不使用布局管理器,则需要先在纸上画好各个组件的位置并计算组件间的距离,再向容器中添加.这样虽然能够灵活控制组件的位置,实现却非常麻烦 ...

  3. Java中的main()方法详解

    源文作者:leizhimin    源文链接:http://lavasoft.blog.51cto.com/62575/53263 源文作者版权申明: 版权声明:原创作品,允许转载,转载时请务必以超链 ...

  4. 《Java和Android开发实战详解》——1.2节Java基础知识

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第1章,第1.2节Java基础知识,作者 陈会安,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

  5. Java多线程之volatile详解

    Java多线程之volatile详解 目录: 什么是volatile? JMM内存模型之可见性 volatile三大特性之一:保证可见性 volatile三大特性之二:不保证原子性 volatile三 ...

  6. Java开发常见面试题详解(JVM)_2

    Java开发常见面试题详解(JVM)_2 JVM 问题 详解 JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots link 你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认 ...

  7. Java 1.8 函数式编程详解

    Java 1.8 函数式编程详解 文章目录 Java 1.8 函数式编程详解 一. 概述 1.1 java 8 新特性: 二. 函数式接口 2.1 函数式接口概述 2.2 Lambda表达式概述 2. ...

  8. Java并发编程最佳实例详解系列

    Java并发编程最佳实例详解系列: Java并发编程(一)线程定义.状态和属性 Java并发编程(一)线程定义.状态和属性 线程是指程序在执行过程中,能够执行程序代码的一个执行单元.在java语言中, ...

  9. Java中的static关键字详解

    ** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...

  10. java中的进制输出转换_Java I/O : Java中的进制详解

    作者:李强强 上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算.这一讲,泥瓦匠带你走进Java中的进制详解. 一.引子 在Java世界里,99%的工作都是处理这高层. ...

最新文章

  1. 在ESXi主机上关闭无响应的虚拟机
  2. RabbitMQ OS X下安装及常用命令-1
  3. MySQL流程控制函数-case结构
  4. python常用api_[原创]IDAPython常用API整理
  5. c/c++排坑(4) -- c/c++中返回局部变量
  6. X86汇编语言从实模式到保护模式12:存储器的保护
  7. JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)
  8. 修改FCKEditor实现将图片、文件等保存到数据库
  9. html中怎样设置放大功能,CSS如何设置图片放大效果?
  10. 魏武帝 太祖知不可匡正,遂不复献言
  11. SPSS联合Excel进行logistic回归亚组交互效应(交互作用)的可视化分析
  12. FPGA_Verilog学习之旅(2)---浅谈VGA
  13. 高琪老师(零基础初学入门)J20飞机项目飞机爆炸轮播图片
  14. Create user中采用externally操作系统认证方式详解
  15. 杭电oj 2081 手机短号(C++)
  16. 2020下半年新机最新消息_2020下半年3款重磅新机:三星Note20被吹爆,华为Mate40差点意思...
  17. 超赞!编译器和解释器的异同,瞬间明白了
  18. 【目标检测】FPN(Feature Pyramid Network)
  19. 回归和分类模型性能评估指标MSE,MAE,PR,ROC,AUC
  20. 数据库表内导入txt

热门文章

  1. Linux驱动开发-编写W25Q64(Flash)驱动
  2. ORACLE数据库数据迁移
  3. Dell笔记本周期性闪屏故障
  4. selenium之滑块操作
  5. 非线性控制1.0——模糊控制理论基础
  6. WTG--让我们随时随地封装系统!
  7. matlab验证dtft移位性质,7.DTFT的Matlab实现.ppt
  8. 微信发红包的测试点有哪些? 评论/点赞/分享/收藏/收索/上传/下载
  9. 2016集训队论文吉如一
  10. 无线WIFI短信认证解决方案