求根节点到叶节点数字之和
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 23 ms, 内存: 16.1 MB
/*
* 思路:
* 我们可以使用递归和流来解决这个问题。
* 通过使用递归遍历每个节点并将路径上的值累积起来。
*/
import java.util.stream.Stream;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Solution {
public int sumNumbers(TreeNode root) {
return sumNumbers(root, 0);
}
private int sumNumbers(TreeNode node, int sum) {
if (node == null) return 0;
sum = sum * 10 + node.val;
if (node.left == null && node.right == null) return sum;
return Stream.of(node.left, node.right)
.mapToInt(child -> sumNumbers(child, sum))
.sum();
}
}
解释
方法:
此题解使用深度优先搜索(DFS)算法来计算从根到叶子的所有路径数字之和。在递归过程中,我们将当前路径代表的数字作为参数传递到子节点。在每次递归调用中,我们先计算当前节点代表的数字,即将之前的数字乘以10并加上当前节点的值。如果当前节点是叶节点(即没有子节点),则返回当前的路径数字。如果不是叶节点,递归计算左右子节点,将结果相加得到总和。
时间复杂度:
O(n)
空间复杂度:
O(h)(h为树的高度)
代码细节讲解
🦆
在递归函数中,当遇到一个空节点`root == None`时,为什么返回0而不是其他值?
▷🦆
你是如何保证在每次递归调用时,当前路径代表的数字`curNum`正确计算的?请解释`preNum * 10 + root.val`这一步的逻辑。
▷🦆
递归函数`dfs`在处理叶子节点时直接返回`curNum`,这样做有没有可能在某些特殊情况下错误地计算路径的总和?
▷