算法列表

662.二叉树最大宽度 中等

布莱克2026-02-18 22:34二叉树

问题:

给你一棵二叉树的根节点 root ,返回树的 最大宽度

树的 最大宽度 是所有层中最大的 宽度


每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这些 null 节点也计入长度。

题目数据保证答案将会在  32 位 带符号整数范围内。

示例 1:

输入:root = [1,3,2,5,3,null,9]
输出:4
解释:最大宽度出现在树的第 3 层,宽度为 4 (5,3,null,9) 。

示例 2:

输入:root = [1,3,2,5,null,null,9,6,null,7]
输出:7
解释:最大宽度出现在树的第 4 层,宽度为 7 (6,null,null,null,null,null,7) 。

示例 3:

输入:root = [1,3,2,5]
输出:2
解释:最大宽度出现在树的第 2 层,宽度为 2 (3,2) 。

回答:

核心思想

给每个节点分配一个位置编号,就像在数组中存储完全二叉树一样:

  • 根节点位置:1
  • 左子节点位置:parent * 2
  • 右子节点位置:parent * 2 + 1

如何计算层宽?

每层的宽度 = 该层最右节点位置 - 最左节点位置 + 1

var widthOfBinaryTree = function(root) {
    let max = 0;
    let queue = [{node: root, key: 0}];
    while (queue.length) {
        let len = queue.length;
        let first = queue[0].key;
        let last = queue[queue.length - 1].key;
        max = Math.max(max, last - first + 1);
        for (let i = 0; i <len; i++) {
            let { node, key } = queue.shift();
            key = key - first;
            if (node.left) {
                queue.push({ node: node.left, key: key * 2 })
            }
            if (node.right) {
                queue.push({ node: node.right, key: key * 2 + 1 })
            }
        }
    }
    return max;
};


assistant