LeetCode-662. 二叉树最大宽度
题目来源
题目详情
给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。
每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null
节点也计入长度)之间的长度。
示例 1:
输入:
1
/ \\
3 2
/ \\ \\
5 3 9
输出: 4
解释: 最大值出现在树的第 3 层,宽度为 4 (5,3,null,9)。
示例 2:
输入:
1
/
3
/ \\
5 3
输出: 2
解释: 最大值出现在树的第 3 层,宽度为 2 (5,3)。
示例 3:
输入:
1
/ \\
3 2
/
5
输出: 2
解释: 最大值出现在树的第 2 层,宽度为 2 (3,2)。
示例 4:
输入:
1
/ \\
3 2
/ \\
5 9
/ \\
6 7
输出: 8
解释: 最大值出现在树的第 4 层,宽度为 8 (6,null,null,null,null,null,null,7)。
注意: 答案在32位有符号整数的表示范围内。
题解分析
解法一:深度优先搜索
- 本题其实光看题目是看不出来直观的解法的,因为这里存在空节点。但是,考虑到题目中提到了一个关键信息,那就是类似于【完全二叉树】,通过这个性质可以看到解决方案的初步模型。
- 我们给每一个节点一个pos属性,与完全二叉树类似,该属性可以帮助标识同一层两个节点之间的间隔节点数。
- 此外,本题应该使用前序遍历,在继续遍历下一层之前,使用一个map来存储每一层最左边的节点序号,并且每次使用当前的pos减去map中的同一层最左pos来更新结果值。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
Map<Integer, Integer> left = new HashMap<>();// 存储每一层最左边的元素
int res;
public int widthOfBinaryTree(TreeNode root) {
if(root == null){
return 0;
}
res = 1;
dfs(root, 0, 1);
return res;
}
private void dfs(TreeNode node, int depth, int pos){
if(node == null){
return;
}
if(!left.containsKey(depth)){
left.put(depth, pos);
}
res = Math.max(res, pos - left.get(depth) + 1);
dfs(node.left, depth + 1, pos * 2);
dfs(node.right, depth + 1, pos * 2 + 1);
}
}
结果展示
Either Excellent or Rusty