二叉树最大宽度

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

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

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

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

示例 1:

img

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

示例 2:

img

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

示例 3:

img

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

提示:

  • 树中节点的数目范围是 [1, 3000]
  • -100 <= Node.val <= 100

这个题是上一道题的变式,记录每个节点的编号,最大宽度就是队列里最带编号之差

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

class Solution {
private static int max = 3001;
private TreeNode[] queue = new TreeNode[max];
private int[] nums = new int[max];
int l = 0;
int r = 0;
public int widthOfBinaryTree(TreeNode root) {
int res = 0;
if (root != null) {
queue[r] = root;
nums[r++] = 1;
while (l < r) {
int size = r - l;
res = Math.max(res, nums[r - 1] - nums[l] + 1);
for (int i = 0; i < size; i++) {
TreeNode cur = queue[l];
int id = nums[l++];
if (cur.left != null) {
queue[r] = cur.left;
nums[r++] = id * 2;
}
if (cur.right != null) {
queue[r] = cur.right;
nums[r++] = id * 2 + 1;
}
}
}

}
return res;
}
}