Const
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) } }
/**
* 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;
};
437.路径总和III
给定一个二叉树的根节点
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]
-10^9 <= Node.val <= 10^9
-1000 <= targetSum <= 1000