题解方法
深度优先搜索
- 穷举所有节点,统计以当前节点为起始节点的符合要求的路径数量
- 分别统计左右节点情况,返回数量
前缀和
- 前缀和:由根节点到当前节点的路径上所有节点的和
- 先序遍历,记录下根节点到当前节点的路径上除当前节点以外所有节点的前缀和
- 统计在已保存的路径前缀和中是否存在当前节点到根节点的前缀和减去节点pi到根结点的前缀和为targetSum的路径
核心代码
深度优先搜索
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| dfs(root, targetSum);
pathSum(root.left, targetSum); pathSum(root.right, targetSum);
public void dfs(TreeNode root, int targetSum) { if (root == null) { return; }
int val = root.val; if (val == targetSum) { sum++; }
dfs(root.left, targetSum - val); dfs(root.right, targetSum - val); }
|
前缀和
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public void dfs(TreeNode root, int cur, int targetSum) { if (root == null) { return; }
cur += root.val;
sum += prefix.getOrDefault(cur - targetSum, 0);
prefix.put(cur, prefix.getOrDefault(cur, 0) + 1); dfs(root.left, cur, targetSum); dfs(root.right, cur, targetSum); prefix.put(cur, prefix.getOrDefault(cur, 0) - 1); }
|
题目来源
437. 路径总和 III - 力扣(LeetCode) (leetcode-cn.com)