1. 路径总和 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);
    }
};