113.路径总和2

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点

img

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

Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Solution {
// 用于存储所有可能的路径结果的列表
private final List<List<Integer>> ans = new ArrayList<>();
// 用于存储当前路径的列表
private final List<Integer> path = new ArrayList<>();

// 主要方法,寻找所有从根节点到叶子节点路径上节点值之和等于目标和的路径
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
// 调用深度优先搜索方法,初始状态为根节点和目标和
dfs(root, targetSum);
return ans;
}

// 深度优先搜索方法
public void dfs(TreeNode root, int k) {
// 如果当前节点为空,结束搜索
if (root == null) {
return;
}

// 将当前节点的值添加到路径中
path.add(root.val);
// 减去当前节点的值
k -= root.val;

// 如果当前节点是叶子节点且路径和等于目标和,找到一个合法路径,将其添加到结果列表中
if (k == 0 && root.left == null && root.right == null) {
ans.add(new ArrayList<>(path));
}

// 递归调用左子树
dfs(root.left, k);
// 递归调用右子树
dfs(root.right, k);

// 回溯,移除当前节点的值
path.remove(path.size() - 1);
}
}