LeetCode 剑指 Offer II 050. 向下的路径节点之和
题目描述
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
示例 1:
输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出:3
解释:和等于 8 的路径有 3 条,
LeetCode 剑指 Offer II 050. 向下的路径节点之和
提示:
二叉树的节点个数的范围是 [0,1000]
-109 <= Node.val <= 109
-1000 <= targetSum <= 1000
一、解题关键词
二、解题报告
1.思路分析
2.时间复杂度
3.代码示例
class Solution {
public int pathSum(TreeNode root, int targetSum) {
if(root == null){
return 0;
}
int result = rootSum(root,targetSum);
result += pathSum(root.left,targetSum);
result += pathSum(root.right,targetSum);
return result;
}
int rootSum(TreeNode root, int targetSum){
int ret = 0;
if(root == null){
return 0;
}
int val = root.val;
if(val == targetSum){
ret++;
}
ret += rootSum(root.left,targetSum -val);
ret += rootSum(root.right,targetSum - val);
return ret;
}
}
方法二
class Solution {
static Map<Integer, Integer> prefix = new HashMap<>();
public int pathSum(TreeNode root, int targetSum) {
prefix.put(0, 1);
return dfs(root, 0, targetSum);
}
int dfs(TreeNode root, int currValue, int targetSum) {
if (root == null) {
return 0;
}
int ret = 0;
currValue += root.val;
ret = prefix.getOrDefault(currValue - targetSum, 0);
prefix.put(currValue, prefix.getOrDefault(currValue, 0) + 1);
ret += dfs(root.left, currValue, targetSum);
ret += dfs(root.right, currValue, targetSum);
// TODO: 任文涛 2022/4/7 为什么减1
//减1 的原因是恢复当前层的状态 深度优先必须有这个
//恢复本层状态 当前层map存储结果有几步
prefix.put(currValue, prefix.getOrDefault(currValue, 0) - 1);
return ret;
}
}
2.知识点
1、深度优先 前缀和 都可以解题