/**
* Definition for a binary tree node.
* public 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;
* }
* }
*/
class Solution {
//计算所有路径和为targetSym的路径:深度优先搜索
//定义函数rootSum 用来计算以某个节点为起点时的路径和为targetSum的条数
//pathSum函数递归调用自身,遍历所有节点;
// 时间复杂度O(N^2),空间复杂度(N)
// 采用前缀和的方式,时间复杂度O(N),空间复杂度O(N)
// 采用先序遍历的方式用hashmap记录所有路径和,若遍历当前节点时,hashmap中存在路径和-targetsum
// 说明此路径中存在某个节点到当前节点的路径和为target
// 最后需要回溯,防止影响到其他节点
public int pathSum(TreeNode root, long targetSum) { // taegetSum 会溢出,需要改为long
Map<Long, Integer> prefix = new HashMap<>();
prefix.put(0L, 1); // 为了处理路径和刚好等于targetSum的特殊情况
return dfs(root, prefix, 0, targetSum);
}
public int dfs(TreeNode node, Map<Long, Integer> prefix, long curr,long targetSum) {
if (node == null) {
return 0;
}
int count = 0;
curr += node.val;
count = prefix.getOrDefault(curr - targetSum, 0);
prefix.put(curr, prefix.getOrDefault(curr, 0) + 1);
count += dfs(node.left, prefix, curr, targetSum);
count += dfs(node.right, prefix, curr, targetSum);
prefix.put(curr, prefix.get(curr) - 1); // 递归返回后,减少技术,防止影响其他路径的搜索
return count;
}
}