给定一个二叉树和一个目标值,找出二叉树中所有从根节点到叶子节点路径的和等于目标值的路径。注意,叶子节点指的是没有子节点的节点。
例如,给定以下二叉树和目标值 22:
5
/ \
4 8
/ /
11 13 4
/ \ /
7 2 5 1
满足要求的路径为:
[ [5,4,11,2], [5,8,4,5] ] 要求编写一个函数,接收一个二叉树的根节点和一个目标值,返回所有满足要求的路径。
请注意,这道题需要您掌握深度优先搜索(DFS)的算法思想。
class Solution {
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
List<List<Integer>> result = new ArrayList<>();
List<Integer> path = new ArrayList<>();
dfs(root, targetSum, 0, path, result);
return result;
}
private void dfs(TreeNode root, int targetSum, int sum, List<Integer> path, List<List<Integer>> result) {
if (root == null) {
return;
}
sum += root.val;
path.add(root.val);
if (root.left == null && root.right == null) {
if (sum == targetSum) {
result.add(new ArrayList<>(path));
}
} else {
dfs(root.left, targetSum, sum, path, result);
dfs(root.right, targetSum, sum, path, result);
}
path.remove(path.size() - 1);
}
}
在这个实现中,我们使用了深度优先搜索的算法思想,通过递归遍历二叉树,并记录当前路径上的节点值和路径和。当遇到叶子节点时,如果路径和等于目标值,则将当前路径保存下来。
具体实现中,我们定义了一个 dfs() 方法,在其中对每个节点进行遍历,如果当前节点为叶子节点并且路径和等于目标值,则将当前路径保存到结果列表中。如果当前节点不是叶子节点,则继续遍历其左右子树。在递归遍历左右子树之前,需要将当前节点的值加入路径列表中,并在遍历完成后将其从路径列表中移除。