Medium
题目描述
给你一棵二叉树的根节点 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, 10^4]之内 1 <= Node.val <= 100
解题思路
这道题要求找到二叉树中最深叶节点的和。我们可以用多种方法来解决:
方法一:层序遍历(BFS) 使用队列进行层序遍历,记录每一层的节点值之和。遍历完所有层后,最后一层的和就是最深叶节点的和。这种方法思路简单直观。
方法二:深度优先搜索(DFS) 先通过一次 DFS 找到树的最大深度,然后再通过一次 DFS 遍历,将深度等于最大深度的节点值累加起来。
方法三:一次 DFS(推荐) 在递归过程中同时记录当前深度和当前深度下的节点值之和。如果发现更深的层次,就更新最大深度并重置和;如果是相同深度,就累加到当前和中。这种方法只需要一次遍历,效率最高。
本题的关键是准确识别最深的层次,然后对该层次的所有叶节点求和。层序遍历方法最容易理解,而一次 DFS 的方法效率最优。
代码实现
class Solution {
public:
int deepestLeavesSum(TreeNode* root) {
int maxDepth = 0;
int sum = 0;
function<void(TreeNode*, int)> dfs = [&](TreeNode* node, int depth) {
if (!node) return;
if (depth > maxDepth) {
maxDepth = depth;
sum = node->val;
} else if (depth == maxDepth) {
sum += node->val;
}
dfs(node->left, depth + 1);
dfs(node->right, depth + 1);
};
dfs(root, 0);
return sum;
}
};
class Solution:
def deepestLeavesSum(self, root: Optional[TreeNode]) -> int:
max_depth = 0
total_sum = 0
def dfs(node, depth):
nonlocal max_depth, total_sum
if not node:
return
if depth > max_depth:
max_depth = depth
total_sum = node.val
elif depth == max_depth:
total_sum += node.val
dfs(node.left, depth + 1)
dfs(node.right, depth + 1)
dfs(root, 0)
return total_sum
public class Solution {
public int DeepestLeavesSum(TreeNode root) {
int maxDepth = 0;
int sum = 0;
void Dfs(TreeNode node, int depth) {
if (node == null) return;
if (depth > maxDepth) {
maxDepth = depth;
sum = node.val;
} else if (depth == maxDepth) {
sum += node.val;
}
Dfs(node.left, depth + 1);
Dfs(node.right, depth + 1);
}
Dfs(root, 0);
return sum;
}
}
var deepestLeavesSum = function(root) {
if (!root) return 0;
let queue = [root];
let sum = 0;
while (queue.length > 0) {
let levelSize = queue.length;
sum = 0;
for (let i = 0; i < levelSize; i++) {
let node = queue.shift();
sum += node.val;
if (node.left) queue.push(node.left);
if (node.right) queue.push(node.right);
}
}
return sum;
};
复杂度分析
| 算法 | 时间复杂度 | 空间复杂度 |
|---|---|---|
| DFS一次遍历 | O(n) | O(h) |
| BFS层序遍历 | O(n) | O(w) |
其中 n 是树中节点的数量,h 是树的高度,w 是树的最大宽度。对于 DFS 方法,空间复杂度主要来自递归栈;对于 BFS 方法,空间复杂度主要来自队列存储。