给定一个二叉树的根节点 root
,和一个整数 targetSum
,求该二叉树里节点值之和等于 targetSum
的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
今天看这道题目,主要思想是递归+前缀和,之前有做过前缀和的题目,假设我们要在一数组中寻找连续子数组和为 targetSum 的序列,那么我们可以用 map 记录前缀和 curr 以及出现的次数num,当 map 中存在 curr - targetSum 时说明存在连续子数组和为 targetSum 的序列,代码如下
class Solution {
public int pathSum(TreeNode root, int targetSum) {
// 首先定义一个map数据结构,用于存储前缀和出现的次数
Map<Long, Integer> map = new HashMap<Long, Integer>();
// 前缀和为0的次数默认为1
map.put(0L, 1);
return dfs(root, map, targetSum, 0L);
}
private int dfs(TreeNode root, Map<Long, Integer> map, long targetSum, Long curr) {
if (root == null) {
return 0;
}
int ret = 0;
curr += root.val;
// 判断是否出现和为targetSum的序列
ret = map.getOrDefault(curr - targetSum, 0);
// 将这个前缀和存储到map中
map.put(curr, map.getOrDefault(curr, 0) + 1);
// 递归遍历左子树
ret += dfs(root.left, map, targetSum, curr);
// 递归遍历右子树
ret += dfs(root.right, map, targetSum, curr);
// 前缀和思想就是在map中寻找curr - targetSum,避免左右子树的前缀和相互影响,每次遍历完都要将其次数置为0
map.put(curr, map.getOrDefault(curr, 0) - 1);
return ret;
}
}