662. 二叉树最大宽度

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

示例 3:

输入:

      1
/ \
3 2
/
5

输出: 2

解释: 最大值出现在树的第 2 层,宽度为 2 (3,2)。

示例 4:

输入:

      1
/ \
3 2
/ \
5 9
/ \
6 7

输出: 8

解释: 最大值出现在树的第 4 层,宽度为 8 (6,null,null,null,null,null,null,7)。

注意: 答案在32位有符号整数的表示范围内。

PS:

min就是我这一层最左面的点

max就是我右面的点,每一次进去,只要比最左面大,就保存

右面的点–左面的点=我这一层的大小

左面的就是val2-1,我如果有左面的就是我每一层会乘2,然后左面就是减去1

右面的就是val
2;

自己带一个树试试就明白了,我当时也想了半天才明白

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
class Node {
int min, max;
Node next;
} private void calNode(TreeNode node, int val, Node level ){
if (level.min==0) {
level.min=val;
level.max=val;
} else if (val>level.max) {
level.max=val;
}
if (node.left==null && node.right==null) return;
if (level.next==null) level.next = new Node();
if (node.left!=null) calNode(node.left, val*2-1, level.next);
if (node.right!=null) calNode(node.right, val*2, level.next);
} public int widthOfBinaryTree(TreeNode root) {
if (root==null) return 0; Node level = new Node();
calNode(root, 1, level);
int k, res=0;
while (level!=null){
k = level.max - level.min + 1;
if (k>res) res = k;
level = level.next;
}
return res; }
}

最新文章

  1. Griddle, griddle-react 一个REACT 表格组件
  2. 解决postgresql -- ERROR: 42601: query has no destination for result data
  3. Navicat链接Oracle提示ORA-12737
  4. Halcon学习笔记之缺陷检测(一)
  5. java參数传递机制浅析
  6. 同一个form里,不管哪个 submit 都是直接提交form表单里的内容
  7. echarts 柱状图,每根柱子显示不同颜色(随机显示和定制显示)
  8. 部署Tomcat服务时,解决Cannot invoke Tomcat Manager 异常
  9. Django App(二) Connect Mysql & defualt App admin
  10. CSS操作笔记
  11. .Net下的全局异常捕获问题
  12. jqGrid之treeGrid及行拖拽
  13. ReactiveX 学习笔记(21)使用 Rx.NET + ReactiveUI 进行 GUI 编程
  14. 【BZOJ4820】[SDOI2017]硬币游戏(高斯消元)
  15. mybatis DATE_FORMAT 格式化时间输出
  16. 使用double无法得到数学上的精确结果的原因及为何不能用double来初始化BigDecimal
  17. ubuntu设置开机默认进入字符界面方法 ubuntu 12.04 桌面版关闭图形界面(转)
  18. 命令提示符没办法登录MySQL
  19. Ajax 要点
  20. 点击图片查看大图(纯js)

热门文章

  1. redis文章汇总
  2. Awareness Kit让你的音乐APP脱颖而出,更懂用户,也更动人心
  3. Android ListView 代码1
  4. [hdu4358]树状数组
  5. 分布式项目配置工程,在项目间互通要先在linux下开启zookeeper
  6. php_rce
  7. Higher-Order Functions Fundamentals
  8. 客服端负载均衡:Spring Cloud Ribbon
  9. 快速上手Alibaba Arthas
  10. golang基础教程——字符串篇