『LeetCode』662 二叉树最大宽度 发表于 2022-08-27 分类于 LeetCode 阅读次数: Valine: 本文字数: 1.7k 阅读时长 ≈ 2 分钟 题目 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 × root 右孩子编号是父节点编号的两倍加一,即 right = 2 × root + 1 注意到树高度最大可能有 3000 层,也就是说最大编号可能达到 23000, 但答案保证在 32 位整数范围内,也就是说最左和最右的位置不会超过 232,所以对编号进行取余即可,为了避免取余后左结点编号小右结点编号大的情况,需要将数据设置为 long 即可保证最后的距离不会溢出。 实际操作中,使用位移运算代替直接的乘法运算即可起到乘 2 且取余的效果。 123456789101112131415# Code language: Pythonclass 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()) 12345678910111213141516171819// Code language: Javaclass 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 查看更多题解 本文作者: MeteorDream 本文链接: https://meteordream.github.io/LeetCode/2022-08/662_二叉树最大宽度(中等).html 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处! --- ♥ end ♥ --- 欢迎关注我呀~ WeChat GitHub LeetCode