层数最深叶子节点的和
难度:
标签:
题目描述
给你一棵二叉树的根节点 root
,请你返回 层数最深的叶子节点的和 。
示例 1:
输入:root = [1,2,3,4,5,null,6,7,null,null,null,null,8] 输出:15
示例 2:
输入:root = [6,7,8,2,7,1,3,9,null,1,4,null,null,null,5] 输出:19
提示:
- 树中节点数目在范围
[1, 104]
之间。 1 <= Node.val <= 100
代码结果
运行时间: 91 ms, 内存: 19.0 MB
/*
* 思路:
* 使用Java Stream API的方式不太适合处理树的层序遍历,
* 因为Stream API更适合处理集合类的数据。
* 这里仍然使用BFS算法,但通过Stream API来构造和处理数据。
*/
import java.util.*;
import java.util.stream.Collectors;
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;
}
}
public class Solution {
public int deepestLeavesSum(TreeNode root) {
if (root == null) return 0;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int sum = 0;
while (!queue.isEmpty()) {
List<TreeNode> currentLevel = new ArrayList<>();
sum = 0; // reset sum for current level
queue.stream().forEach(node -> {
sum += node.val;
if (node.left != null) currentLevel.add(node.left);
if (node.right != null) currentLevel.add(node.right);
});
queue = new LinkedList<>(currentLevel);
}
return sum;
}
}
解释
方法:
题解采用了宽度优先搜索(BFS)的方法。通过一个队列来遍历二叉树的每一层。对于每一层,计算其所有节点的值的和,并更新最深层叶子节点的和。当遍历完成时,最后一层即为最深层,其节点和即为所求。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
如何确保宽度优先搜索(BFS)始终在遍历到最深层的叶子节点后停止,而不会提前结束?
▷🦆
在宽度优先搜索中,为何选择使用队列而不是其他数据结构如堆或栈?
▷🦆
算法中的`level_sum`变量在每一层的开始时为什么要重置为0?是否有可能在不重置的情况下计算最终结果?
▷🦆
在树的每一层遍历结束时,你是如何判断该层是否为最深层的叶子节点层?
▷