[路飞]_leetcode-662-二叉树最大宽度

简介: leetcode-662-二叉树最大宽度

网络异常,图片无法展示
|


[题目地址][B站地址]


给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(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位有符号整数的表示范围内。


因为每一层的宽度被定义为两个端点之间的长度,所以想要获取每一层的宽度,首先需要获取这两个端点,也就是获取每一层的真实节点


获取到端点之后,如何获取它们之间的长度呢?


我们可以给每一个节点一个下标,这样两个端点的下标值相减,就是它们之间的宽度。

如果给每个节点定义下标呢?


这里通过如下规则定义:


左子节点的下标为父节点下标 ind*2-1


右子节点的下标为父节点下标 ind*2


有了每层的端点节点以及它们的下标,就可以获取每一层的宽度,然后对比每一层的宽度,获取最大值,就是整棵二叉树的最大宽度。


动画演示如下:


网络异常,图片无法展示
|


代码如下:


var widthOfBinaryTree = function(root) {
  // 每层节点的下标数组,取模运算的值
  const arr = [],mod = 10000000007;
  // 获取每一层节点的下标
  function getNodeInd(root,deep,ind){
    if(root === null) return;
    if(!arr[deep]) arr[deep] = [];
    arr[deep].push(ind);
    getNodeInd(root.left,deep+1,(ind*2-1)%mod);
    getNodeInd(root.right,deep+1,(ind*2)%mod);
  };
  getNodeInd(root,0,1);
  // 初始化最大宽度为1
  let max = 1;
  // 遍历下标数组
  for(let i = 1;i<arr.length;i++){
    // 如果当前层节点数量大于1,计算宽度
    if(arr[i].length>1){
      max = Math.max(max,arr[i].pop()-arr[i][0]+1)
    }
  }
  // 返回结果值
  return max;
};
复制代码


至此我们就完成了 leetcode-662-二叉树最大宽度


如有任何问题或建议,欢迎留言讨论!

相关文章
|
3月前
【LeetCode 31】104.二叉树的最大深度
【LeetCode 31】104.二叉树的最大深度
31 2
|
3月前
【LeetCode 29】226.反转二叉树
【LeetCode 29】226.反转二叉树
27 2
|
3月前
【LeetCode 28】102.二叉树的层序遍历
【LeetCode 28】102.二叉树的层序遍历
22 2
|
3月前
【LeetCode 43】236.二叉树的最近公共祖先
【LeetCode 43】236.二叉树的最近公共祖先
25 0
|
3月前
【LeetCode 38】617.合并二叉树
【LeetCode 38】617.合并二叉树
22 0
|
3月前
【LeetCode 37】106.从中序与后序遍历构造二叉树
【LeetCode 37】106.从中序与后序遍历构造二叉树
28 0
|
3月前
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径
28 0
|
3月前
【LeetCode 32】111.二叉树的最小深度
【LeetCode 32】111.二叉树的最小深度
22 0
|
5月前
|
存储 算法
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
文章深入探讨了二叉树的层序遍历方法,并展示了如何通过队列实现层序遍历的算法逻辑,同时指出掌握层序遍历技巧可以帮助解决LeetCode上的多道相关题目。
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
|
5月前
|
算法 Java
LeetCode第94题二叉树的中序遍历
文章介绍了LeetCode第94题"二叉树的中序遍历"的解法,使用递归实现了中序遍历的过程,遵循了"左根右"的遍历顺序,并提供了清晰的Java代码实现。
LeetCode第94题二叉树的中序遍历