携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情
题目详情
LeetCode题库序号 662. 二叉树最大宽度 ,难度为 中等。
Tag : 「深度优先搜索」 给你一棵二叉树的根节点 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
深度优先搜索
题解思路:这道题目会涉及到二叉树的存储形式,首先,二叉树最常用的是链表式的存储,但是假如该二叉树是一棵完全二叉树的话,使用数组的顺序存储会更加节省空间,节点之间会更紧凑,二叉树的顺序存储,根节点会是在数组索引1,左节点的索引位置2 * index,右节点的索引位置为2 * index + 1。我们使用一个map来存储每一层的最左节点,然后每次根据节点的计算公司,算取最大的宽度,详情见以下代码:
题解代码
class Solution {
Map<Integer, Integer> min = new HashMap<Integer, Integer>();
public int widthOfBinaryTree(TreeNode root) {
return dfs(root, 1, 1);
}
public int dfs(TreeNode node, int depth, int index) {
if (node == null) {
return 0;
}
min.putIfAbsent(depth, index);
return Math.max(index - min.get(depth) + 1, Math.max(dfs(node.left, depth + 1, index * 2),
dfs(node.right, depth + 1, index * 2 + 1)));
}
}
结尾
我的"刷完LeetCode题库"系列文章的第 No.662 序号的题目,本次刷题之旅系列开始于 2022-06-12,因为LeetCode上部分是有锁题,我自己的目标是将先把所有不带锁的题目刷完。自己能够通过这次刷题之旅勉励自己,并且提升逻辑思维能力。这个系列的文章就是会见证我自己的一个成长过程!
思路虽然不是最优的,但是我会尽我所能!
为了让我自己的刷题之旅不中断,我特地建立了相关的仓库,来记录我自己的刷题之旅。 github.com/jackpan123/… 。