Typescript-Algorithms
    Preparing search index...

    Variable path_sum_iiiConst

    path_sum_iii: (root: null | TreeNode, targetSum: number) => number = pathSum

    437.路径总和III

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

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


    示例1

    输入: root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8

    输出: 3

    解释: 和等于 8 的路径有 3 条,如图所示。


    输入: root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22

    输出: 3


    • 二叉树的节点个数的范围是 [0,1000]
    • -10^9 <= Node.val <= 10^9
    • -1000 <= targetSum <= 1000

    Type declaration

      • (root: null | TreeNode, targetSum: number): number
      • Definition for a binary tree node. class TreeNode { val: number left: TreeNode | null right: TreeNode | null constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { this.val = (val===undefined ? 0 : val) this.left = (left===undefined ? null : left) this.right = (right===undefined ? null : right) } }

        Parameters

        • root: null | TreeNode
        • targetSum: number

        Returns number

    /**
    * Definition for a binary tree node.
    * class TreeNode {
    * val: number
    * left: TreeNode | null
    * right: TreeNode | null
    * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
    * this.val = (val===undefined ? 0 : val)
    * this.left = (left===undefined ? null : left)
    * this.right = (right===undefined ? null : right)
    * }
    * }
    */

    // 实现1
    function pathSum(root: TreeNode | null, targetSum: number): number {
    let ans = 0;
    let pre = 0;
    const preToCnt = new Map<number, number>();
    preToCnt.set(0, 1);

    function dfs(node: TreeNode | null) {
    if (!node) {
    return;
    }

    pre += node.val;

    const pre1 = pre - targetSum;
    const cnt = preToCnt.get(pre1) ?? 0;

    ans += cnt;
    preToCnt.set(pre, (preToCnt.get(pre) ?? 0) + 1);

    dfs(node.left);
    dfs(node.right);

    preToCnt.set(pre, (preToCnt.get(pre) ?? 0) - 1);
    pre -= node.val;
    }

    dfs(root);

    return ans;
    };

    // 实现2
    function pathSum1(root: TreeNode | null, targetSum: number): number {
    // 这道题给了“路径”限制:从上到下,也就是父到子的方向
    // DFS 遍历这棵树,遍历到节点 node 时,假设 node 是路径的终点,那么有多少个起点,满足起点到终点node的路径总和恰好等于targetSum?
    let k = targetSum;
    let pre = 0;
    let ans = 0;
    const map = new Map<number, number>();
    map.set(0, 1);

    function dfs(node: TreeNode | null, pre: number) {
    if (!node) {
    return;
    }

    pre += node.val;
    const x = pre - k;
    const count = map.get(x);

    ans += count ?? 0;
    map.set(pre, (map.get(pre) ?? 0) + 1);

    dfs(node.left, pre);
    dfs(node.right, pre);

    map.set(pre, map.get(pre)! - 1);
    }

    dfs(root, pre);

    return ans;
    };