链接
牛客: 二叉树中和为某一值的路径
LeetCode:剑指 Offer 34. 二叉树中和为某一值的路径
思路
题目给定的函数返回的是一个包含List的List,类似一个二维数组,这表示路径可能不止一条,利用递归+回溯进行处理。
代码
牛客:
import java.util.ArrayList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
private ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>();
private ArrayList<Integer> list = new ArrayList<Integer>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
if(root == null)
return listAll;
list.add(root.val);
target -= root.val;
//这里要关注一下为什么要在外面加上new ArrayList<Integer>()
//因为add添加的是引用,如果不new一个的话,后面的操作会更改这个list 涉及到递归还是需要注意这些的
if(target == 0 && root.left == null && root.right == null)
listAll.add(new ArrayList<Integer>(list));
FindPath(root.left, target);
FindPath(root.right, target);
//这里的回溯很重要
list.remove(list.size()-1);
return listAll;
}
}
LeetCode:
class Solution {
private List<List<Integer>> list = new ArrayList<>();
private LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> pathSum(TreeNode root, int sum) {
if (root == null) {
return list;
}
help(root, sum);
return list;
}
public void help(TreeNode root, int sum) {
if (root == null) {
return;
}
path.add(root.val);
if (root.left == null && root.right == null && root.val == sum) {
list.add(new LinkedList<>(path));
}
help(root.left, sum - root.val);
help(root.right, sum - root.val);
path.removeLast();
}
}