0%

『LeetCode』662 二叉树最大宽度

题目

662. 二叉树最大宽度

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

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

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

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

示例 1:

width1-tree

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

示例 2:

img

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

示例 3:

img

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

提示:

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

标签

树, 深度优先搜索, 广度优先搜索, 二叉树


题解

【二叉树最大宽度】模拟

DFS与模拟

统计二叉树每层最左结点的位置和最右位置然后再计算距离即可,所谓结点所在位置按照满二叉树编号易得规律为:

  • 左孩子编号是父节点编号的两倍,即 \(left = 2 \times root\)
  • 右孩子编号是父节点编号的两倍加一,即 \(right = 2 \times root + 1\)

注意到树高度最大可能有 3000 层,也就是说最大编号可能达到 \(2^{3000}\), 但答案保证在 32 位整数范围内,也就是说最左和最右的位置不会超过 \(2^{32}\),所以对编号进行取余即可,为了避免取余后左结点编号小右结点编号大的情况,需要将数据设置为 long 即可保证最后的距离不会溢出。

实际操作中,使用位移运算代替直接的乘法运算即可起到乘 2 且取余的效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Code language: Python
class Solution:
def widthOfBinaryTree(self, root: Optional[TreeNode]) -> int:
left, right = defaultdict(lambda : float('inf')), defaultdict(lambda : -1)

def dfs(root, deep, loc):
if not root: return
left[deep] = min(left[deep], loc)
right[deep] = max(right[deep], loc)
dfs(root.left, deep + 1, 2 * loc)
dfs(root.right, deep + 1, 2 * loc + 1)

dfs(root, 0, 1)

return max(right[k] - left[k] + 1 for k in left.keys())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Code language: Java
class Solution {
long[] left = new long[3007];
long ans = -1;
public int widthOfBinaryTree(TreeNode root) {
Arrays.fill(left, Long.MAX_VALUE);

dfs(root, 0, 1);
return (int)ans;
}

public void dfs(TreeNode root, int deep, long loc) {
if (root == null) return ;
left[deep] = Math.min(left[deep], loc);
ans = Math.max(ans, loc - left[deep] + 1);
dfs(root.left, deep + 1, loc << 1);
dfs(root.right, deep + 1, loc << 1 | 1);
}
}
  • 时间复杂度: \(O(n)\)
  • 空间复杂度: \(O(n)\)

如果对你有帮助的话,请给我点个赞吧~

欢迎前往 我的博客Algorithm - Github 查看更多题解

--- ♥ end ♥ ---

欢迎关注我呀~