路径总和 III

题解方法

  • 深度优先搜索
  • 前缀和

深度优先搜索

  • 穷举所有节点,统计以当前节点为起始节点的符合要求的路径数量
  • 分别统计左右节点情况,返回数量

前缀和

  • 前缀和:由根节点到当前节点的路径上所有节点的和
  • 先序遍历,记录下根节点到当前节点的路径上除当前节点以外所有节点的前缀和
  • 统计在已保存的路径前缀和中是否存在当前节点到根节点的前缀和减去节点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)