一、题目概述
二、思路方向
为了找出从根节点到叶子节点路径总和等于给定目标和的所有路径,我们可以使用深度优先搜索(DFS)的方法。在遍历过程中,我们维护一个当前路径的和以及一个列表来存储当前路径的节点值。当我们到达一个叶子节点时,检查当前路径的和是否等于目标和,如果是,则将该路径添加到结果中。
三、代码实现
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Solution {
List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
List<Integer> currentPath = new ArrayList<>();
dfs(root, targetSum, currentPath);
return result;
}
private void dfs(TreeNode node, int targetSum, List<Integer> currentPath) {
if (node == null) {
return;
}
// 将当前节点的值添加到路径中
currentPath.add(node.val);
// 如果到达叶子节点,并且路径和等于目标和,则将路径添加到结果中
if (node.left == null && node.right == null && targetSum == node.val) {
result.add(new ArrayList<>(currentPath));
} else {
// 否则,继续递归搜索左右子树
// 减去当前节点的值,因为我们要找的是从根节点到叶子节点的路径和
dfs(node.left, targetSum - node.val, currentPath);
dfs(node.right, targetSum - node.val, currentPath);
}
// 回溯,移除当前节点,以便在回溯到父节点时构建正确的路径
currentPath.remove(currentPath.size() - 1);
}
public static void main(String[] args) {
// 示例用法
TreeNode root = new TreeNode(5);
root.left = new TreeNode(4);
root.right = new TreeNode(8);
root.left.left = new TreeNode(11);
root.left.left.left = new TreeNode(7);
root.left.left.right = new TreeNode(2);
root.right.left = new TreeNode(13);
root.right.right = new TreeNode(4);
root.right.right.right = new TreeNode(1);
Solution solution = new Solution();
List<List<Integer>> paths = solution.pathSum(root, 22);
// 输出结果
for (List<Integer> path : paths) {
System.out.println(Arrays.toString(path.toArray(new Integer[0])));
}
}
}
执行结果:
四、小结
注意:
上面的代码有一个小错误,即在叶子节点的判断条件中,我们直接检查了
targetSum == node.val
,这实际上只适用于路径和正好等于叶子节点值的情况。为了修复这个问题,我们应该在递归调用dfs
时始终传递剩余的targetSum
(即targetSum - node.val
),并在叶子节点处检查targetSum
是否减到0。我已经在上面的代码中修复了这个错误。
结语
能用汗水解决的问题
就尽量别用泪水
!!!