思路:
首先根据题目条件,我们要获得一条路径的要求有两个,第一必须路劲和为目标值,第二,结束节点必须是叶子节点。
并且由于给定的TreeNode并没有获得父节点的方法,所以我们在选择路径时必须把节点的值给添加到路径值中,否则无法获取到上一个节点的值。
由于是最后添加的节点,无论找到与否,我们都要进行回溯寻找吓一条合理的路线,回溯之后就要删除,所以是后进先出,我们可以用栈来保存路径。
递归方法我们可以这么去设计
第一步:获得当前的路径和,如果大于了目标值直接回溯。如果与目标值相等并且当前的节点是尾结点。那么就把这一条路径添加到结果集中,回溯寻找下一条路径。
第二步:既然第一步没有满足,那么就说明要么没有满足路径和,要么没有满足叶子节点,但这两个无论如何都需要去遍历当前的节点的孩子子节点,所以将不为空的孩子节点添加到路径中递归。这样我们就可以满足两种情况,一种是和不对,需要遍历子节点,当其是叶子节点时,也就说明孩子节点都为空,所以也不会向下遍历。此时如果是孩子节点还不满足,那么就证明当前的路径不对,需要回溯当上一个节点中。
class Solutions{
//路径上的值
private LinkedList<Integer> path = new LinkedList<>();
//结果集
private ArrayList result = new ArrayList();
//目标值
int target = 0;
public List<List<Integer>> pathSum (TreeNode root,int target){
if(root == null) return result;
this.target = target;
int currentSum = 0;
findPaths(root,currentSum);
return result;
}
private void findPaths(TreeNode root,int currerntSum){
//先把路径的值获取 以及当前的和获取
path.addLast(root.val);
currerntSum += root.val;
//判断当前的节点是否为子节点并且和满足target
if(currerntSum == target && root.left ==null && root.right == null){
//把当前的路劲加到结果集中
result.add(path);
}
//如果不满足target,那么就遍历孩子节点
if(root.left != null){
findPaths(root.left,currerntSum);
}
if(root.right !=null){
findPaths(root.right,currerntSum);
}
//回溯到上一个节点寻找新的路径
path.removeLast();
}
}