662. 二叉树最大宽度

365 阅读2分钟

662. 二叉树最大宽度

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

每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。

输入:

       1[0]
     /      \
    3[0]     2[1]  queue = [[3,0], [2,1]]
   /    \       \  
  5[0]   3[1]     9[3]    

输出: 4 解释: 最大值出现在树的第 3 层,宽度为 4 (5,3,null,9)。

解法
  • 我们这里需要对每个节点进行编号如上面中括号所示。
  • 编号完毕算出每次最后一个节点-第一个节点的编号+1 就是最大宽度了
  • 然后取每层最大的宽度 如何编号呢? 需要一个队列queue将以[节点, 编号]的形式存储到队列里 首先我们需要将根节点放进来[root, 0] 然后初始化l,r分别为左右两边节点的编号,然后遍历queue中的节点对右边的节点值编号更新r的值。遍历的同时还要将节点的左子节点和右子节点的以[节点, 编号]的形式加入队列里。(这里子节点的编号在测试用例给出了数值超过js的存储大小,所以呢,我们要计算一个相对编号,即当前编号减去左边节点的编号) 遍历结束后即当前层级的二叉树就得到了宽度为r-l+1 最后得出最大宽度。
完整代码
var widthOfBinaryTree = function(root){
    var queue = [], ans= 0
    queue.push([root,0])
    while(queue.length> 0){
        let len = queue.length
        let l = r = queue[0][1]
        for(let i =0;i<len;i++){
            const [node, ind] = queue.shift()
            r = ind // 每遍历一下刷新右侧节点编号
            if(node.left)queue.push([node.left, (ind-l) *2])
            if(node.right)queue.push([node.right, (ind-l) *2 + 1])
        }
        ans = Math.max(ans, r-l+1)
    }
    return ans;
}