目录

0662:二叉树最大宽度(★)

力扣第 662 题

题目

给你一棵二叉树的根节点 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, 3000]
  • -100 <= Node.val <= 100

分析

满二叉树的一个性质是对于序号 i 的节点,其左右子树节点的序号分别为 2i,2i+1。

因此层序遍历并保存节点在满二叉树中的序号,每层宽度即可由该层的第一个节点和最后一个节点的序号计算得到。

解答

1
2
3
4
5
6
def widthOfBinaryTree(self, root: TreeNode) -> int:
    res, level = 0, [(root, 0)]
    while level:
        res = max(res, level[-1][1]-level[0][1]+1)
        level = [(child, y) for node, x in level for child, y in [(node.left, 2*x), (node.right, 2*x+1)] if child]
    return res

52 ms