- 路径总和 III
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
解析:
基于树上的前缀和,不包括回路,一条路线上的前缀和,使用map来维护,当前节点回溯的时候需要恢复前缀和
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
map<int, int> maps;
int dfs (TreeNode *root, int sum, int targetSum) {
if (root == nullptr) return 0;
int res = 0;
sum += root -> val;
if (maps.count(sum - targetSum)) {
res += maps[sum - targetSum];
}
maps[sum]++;
res += dfs(root -> left, sum, targetSum);
res += dfs(root -> right, sum, targetSum);
maps[sum]--;
return res;
}
int pathSum(TreeNode* root, int targetSum) {
maps[0] = 1;
return dfs(root, 0, targetSum);
}
};