[路飞]_leetcode_662.二叉树最大宽度

204 阅读1分钟

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

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

解题思路

示例1

           1
         /   \
        3     2
       / \     \  
      5   3     9 

           1
         /   \
        2     3
       / \     \  
      4   5     7 

示例1二叉树的最大宽度是4,也就是最后一层的节点(5, 3, null, 9)所组成的最大宽度,我们可以将每一层的每个节点都做顺序编号,这样我们就可以很容易的值的当前层的宽度

比如:

第2层的宽度为 编号3 - 编号2 + 1 = 2
第3层的宽度为 编号7 - 编号4 + 1 = 4

所以我们可以对二叉树给每个节点设置一个编号,然后对二叉树进行层序遍历(层序遍历使用迭代方式),将每层编号的最大值和最小值相减加1得到这一层的最大宽度

代码

var widthOfBinaryTree = function(root) {
    if (!root) return 0
    // 1n表示大整数
    let maxWidth = 1, queue = [[1n, root]]
    while(queue.length) {
        // 取当前层编号最大值和最小值计算宽度
        let width = queue[queue.length - 1][0] - queue[0][0] + 1n
        if (width > maxWidth) maxWidth = width
        let temp = []
        // 遍历二叉树下一层
        for (const [i, r] of queue) {
            r.left && temp.push([i * 2n, r.left])
            r.right && temp.push([i * 2n + 1n, r.right])
        }
        queue = temp
    }
    return Number(maxWidth)
};