思路是,不断递归剪枝。
评论区大佬的代码:(做了一点注释)
class Solution {
private List<List<Integer>> res;
// 二叉树中和为某一值的路径
public List<List<Integer>> pathSum(TreeNode root, int sum) {
res = new ArrayList<>();
backtrack(root, sum, new ArrayList<>());
return res;
}
private void backtrack(TreeNode node, int target, List<Integer> collector) {
//当节点为空的时候
if (node == null) {
return;
}
//添加当前节点的值
collector.add(node.val);
//用目标值减去当前节点的值
target -= node.val;
//如果满足所有条件,目标值,左右节点都为空,那么添加这个链表到res里去
if (target == 0 && node.left == null && node.right == null) {
res.add(new ArrayList<>(collector));//ArrayList可以通过括号里传入arralist,来设置链表
}
//上面条件不满足,且左右节点不为空,继续遍历他的左右节点
else {
backtrack(node.left, target, collector);
backtrack(node.right, target, collector);
}
//当if里的条件不满足时,且左右节点都为空时,跳到这里,删除当前节点
collector.remove(collector.size() - 1);
}
}