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;
};