[路飞]_js算法:662. 二叉树最大宽度

167 阅读2分钟

662. 二叉树最大宽度

问题描述: 给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree) 结构相同,但一些节点为空。(by leetcode 662)

每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的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)。

思路 用队列来解决,记录位置(利用满二叉树特点) 见代码注释

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var widthOfBinaryTree = function(root) {
    if(root==null)return 0;
    let pos=[[root,0]];//数组每一项代表当前节点及位置
    let left=0,right=0,res=0;
    while(pos.length){//当队列不为空,开始计算当前行子节点位置,并放到队列中,同时从队列中移除上一行
        left=pos[0][1];//记录上一行开始位置pos。左子树就是pos*2 右子树pos*+
        const len=pos.length;//保存住上一行获得的队列长度,因为后面队列会更新,长度会发生变化。
        for(let i=0;i<len;i++){
            let [level,rig]=pos.shift();//上一行当前节点
            right=rig;
            level.left&&pos.push([level.left,2*(rig-left)]);//本行添加左节点位置 减去上一层做左边节点的开始位置,避免出现溢出,因为我们只需要计算差值。
            level.right&&pos.push([level.right,2*(rig-left)+1]);//本行添加右节点位置
           
        }
         res=Math.max(res,right-left+1)//每一行(上一行)宽度
    }
    return res;
};