题目地址:路径总和 II
解题思路
本文解题思路来自左程云老师算法课新手班第七节
具体思路可以查看上一篇文章,
这个与之不同的是,将布尔的isSum变为List<List<Integer>>
public static List<List<Integer>> ans = new ArrayList<>();
将叶节点内的语句变为、
if (x.left == null && x.right == null) {
if (preSum + x.val == sum) {
cur.add(x.val);
ans.add(copy(cur));
cur.remove(cur.size() - 1);
}
return;
}
将整个process内的的参数要新增一个List<Integer> cur,这个参数就是最后节点里面的小链表,至于为何要remove,可以看如下的例子
假设现在到了节点11,下面两个都是符合最终条件的叶节点,出现了一个[5,4,11,2]的cur,然后如果不进行清理,到下一个的节点2的时候,cur还是[5,4,11,2],因为链表是按引用传递。
这就是为啥往ans内添加结果要进行copy的原因
public static List<Integer> copy(List<Integer> path) {
List<Integer> ans = new ArrayList<>();
for (Integer num : path) {
ans.add(num);
}
return ans;
}
当然在写完左右的递归后,同样也需要进行清理。
完整代码
public static List<List<Integer>> ans = new ArrayList<>();
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
List<Integer> cur = new ArrayList<>();
ans = new ArrayList<>();
if (root == null) {
return ans;
}
process(root, 0, targetSum, cur);
return ans;
}
public static void process(TreeNode x, int preSum, int sum, List<Integer> cur) {
if (x.left == null && x.right == null) {
if (preSum + x.val == sum) {
cur.add(x.val);
ans.add(copy(cur));
cur.remove(cur.size() - 1);
}
return;
}
cur.add(x.val);
preSum += x.val;
if (x.left != null) {
process(x.left, preSum, sum, cur);
}
if (x.right != null) {
process(x.right, preSum, sum, cur);
}
cur.remove(cur.size() - 1);
}
public static List<Integer> copy(List<Integer> path) {
List<Integer> ans = new ArrayList<>();
for (Integer num : path) {
ans.add(num);
}
return ans;
}