路径总和 III
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 34 ms, 内存: 16.5 MB
/*
思路:
1. 将树的节点转换为列表。
2. 使用流操作计算路径和。
3. 通过递归计算每个节点的路径和。
4. 使用流操作求和。
*/
import java.util.*;
import java.util.stream.*;
public class Solution {
public int pathSum(TreeNode root, int targetSum) {
List<TreeNode> nodes = new ArrayList<>();
traverse(root, nodes);
return nodes.stream().mapToInt(node -> countPaths(node, targetSum)).sum();
}
private void traverse(TreeNode node, List<TreeNode> nodes) {
if (node != null) {
nodes.add(node);
traverse(node.left, nodes);
traverse(node.right, nodes);
}
}
private int countPaths(TreeNode node, int sum) {
if (node == null) return 0;
return (node.val == sum ? 1 : 0)
+ countPaths(node.left, sum - node.val)
+ countPaths(node.right, sum - node.val);
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
解释
方法:
该题解采用了深度优先搜索(DFS)和哈希表来解决问题。首先,我们递归地遍历树的每一个节点,同时维护当前路径的累计和。哈希表`Sumpath`用于存储每个节点到根节点路径上的累计和及其出现的次数。对于每个节点,我们检查`当前累计和 - 目标和`是否已经在哈希表中,如果存在,则说明我们找到了一个有效路径。在递归进入左右子节点之前,更新哈希表以包含当前累计和。在从子节点返回后,为了不影响其他路径,需要将当前累计和的计数减一,以防止它干扰其他路径的计算。这种方法有效地利用了前缀和的概念,即使用累计和减去目标值来快速检查是否存在符合条件的路径。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在递归遍历过程中更新哈希表`Sumpath`的操作对算法性能有何影响,尤其是在面对大数据量时?
▷🦆
为什么在从子节点返回到父节点后需要对哈希表`Sumpath`中的当前累计和的计数进行减一操作?
▷🦆
在哈希表`Sumpath`中,初始设置`0:1`的原因是什么?
▷