最大层内元素和
难度:
标签:
题目描述
给你一个二叉树的根节点 root
。设根节点位于二叉树的第 1
层,而根节点的子节点位于第 2
层,依此类推。
请返回层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那个。
示例 1:
输入:root = [1,7,0,7,-8,null,null] 输出:2 解释: 第 1 层各元素之和为 1, 第 2 层各元素之和为 7 + 0 = 7, 第 3 层各元素之和为 7 + -8 = -1, 所以我们返回第 2 层的层号,它的层内元素之和最大。
示例 2:
输入:root = [989,null,10250,98693,-89388,null,null,null,-32127] 输出:2
提示:
- 树中的节点数在
[1, 104]
范围内 -105 <= Node.val <= 105
代码结果
运行时间: 132 ms, 内存: 19.6 MB
/*
* 思路:
* 虽然Java Streams不是特别适合处理树结构,但我们依然可以
* 使用广度优先搜索(BFS)来收集每一层的节点,然后使用
* Stream API来计算每层的和。
*/
import java.util.*;
import java.util.stream.*;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
class Solution {
public int maxLevelSum(TreeNode root) {
if (root == null) return 0;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int maxSum = Integer.MIN_VALUE;
int maxLevel = 1;
int currentLevel = 1;
while (!queue.isEmpty()) {
int levelSize = queue.size();
int levelSum = queue.stream().limit(levelSize).mapToInt(node -> node.val).sum();
if (levelSum > maxSum) {
maxSum = levelSum;
maxLevel = currentLevel;
}
for (int i = 0; i < levelSize; i++) {
TreeNode node = queue.poll();
if (node.left != null) queue.offer(node.left);
if (node.right != null) queue.offer(node.right);
}
currentLevel++;
}
return maxLevel;
}
}
解释
方法:
该题解使用了广度优先搜索(BFS)来遍历二叉树的每一层,并计算每一层的节点值之和。算法初始化时,将二叉树的根节点放入队列中。在每一次循环中,算法处理当前队列中的所有节点(即当前层的所有节点),计算这一层的总和,并将其子节点放入下一个队列中,为处理下一层做准备。同时,算法比较当前层的总和与之前记录的最大层的总和,如果当前层的总和更大,则更新最大总和和对应的层号。这一过程持续进行,直到所有层都被处理完毕。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在计算每一层的元素总和时,如果某一层的所有节点都是负数,算法如何处理这种情况?
▷🦆
为什么在遍历树的时候选择使用广度优先搜索(BFS),而不是深度优先搜索(DFS)?
▷🦆
在处理队列时,算法是如何确保它始终包含当前层的所有节点的?
▷🦆
在算法中,当存在多个层的元素之和相等时,如何保证返回的是最小的层号?
▷