问题描述
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
示例1
输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出:3
解释:和等于 8 的路径有 3 条,如图所示。
示例 2:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:3
提示:
二叉树的节点个数的范围是 [0,1000]
-109 <= Node.val <= 109
-1000 <= targetSum <= 1000
题目地址:437. 路径总和 III
解题思路
这道题用到了一个概念,叫前缀和。就是到达当前元素的路径上,之前所有元素的和。
什么是 前缀和?
前缀和怎么应用呢?在同一个路径之下(可以理解成二叉树从root节点出发,到叶子节点的某一条路径),如果两个数的前缀总和是相同的,那么这些节点之间的元素总和为零。
我们利用先序遍历二叉树,记录下根节点 root 到当前节点 pp 的路径上除当前节点以外所有节点的前缀和,在已保存的路径前缀和中查找是否存在前缀和刚好等于当前节点到根节点的前缀和 currcurr 减去 targetSum。
代码:
function helper(root, acc, target, hashmap) {
if (root === null) return 0;
let count = 0;
acc += root.val;
if (acc === target) count++;
if (hashmap[acc - target] !== void 0) {
count += hashmap[acc - target];
}
if (hashmap[acc] === void 0) {
hashmap[acc] = 1;
} else {
hashmap[acc] += 1;
}
const res =
count +
helper(root.left, acc, target, hashmap) +
helper(root.right, acc, target, hashmap);
// 这里要注意别忘记了
hashmap[acc] = hashmap[acc] - 1;
return res;
}
var pathSum = function (root, sum) {
const hashmap = {};
return helper(root, 0, sum, hashmap);
};
标签:acc,hashmap,root,路径,leetcode,前缀,III,节点,总和
From: https://blog.51cto.com/codeniu/6188449