给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。

    路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

    示例 1:
    image.png
    输入: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

    1. /**
    2. * Definition for a binary tree node.
    3. * function TreeNode(val, left, right) {
    4. * this.val = (val===undefined ? 0 : val)
    5. * this.left = (left===undefined ? null : left)
    6. * this.right = (right===undefined ? null : right)
    7. * }
    8. */
    9. /**
    10. * @param {TreeNode} root
    11. * @param {number} targetSum
    12. * @return {number}
    13. */
    14. var pathSum = function (root, targetSum) {
    15. // 前缀和,递归方式,KEY存前缀和,VAL存前缀和数量
    16. const map = new Map();
    17. let res = 0;
    18. dfs(root, 0,)
    19. return res;
    20. function dfs(root, presum) {
    21. if (!root) return 0;
    22. map.set(presum, (map.get(presum) || 0) + 1);
    23. let target = presum + root.val;
    24. // 公共路径为当前节点和另一节点的差
    25. res += (map.get(target - targetSum) || 0);
    26. dfs(root.left, target);
    27. dfs(root.right, target);
    28. // 后序遍历,回溯,路径方向必须是向下
    29. map.set(presum, map.get(presum) - 1)
    30. }
    31. };

    image.png