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
通过次数56,901提交次数136,276
法 1 修改节点值
思路
一遍遍历一遍修改节点值,使得满足 左节点 右节点值分别为 2 * root_val +1 , 2 * root_val + 2。然后层次遍历,取每一层最右边与最左边之差。
题解
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def widthOfBinaryTree(self, root: Optional[TreeNode]) -> int: if root is None: return 0 root.val = 0 queue = deque() queue.append(root) res = 0 while queue: size = len(queue) res = max(res, queue[-1].val - queue[0].val + 1) while size: cur_node = queue.popleft() size -= 1 cur_val = cur_node.val if cur_node.left: cur_node.left.val = cur_val * 2 + 1 queue.append(cur_node.left) if cur_node.right: cur_node.right.val = cur_val * 2 + 2 queue.append(cur_node.right) return res