package June;
import java.util.ArrayList;
public class 二叉树中和路径 {
/* 看了别人的代码,自己写注释,理解的。
* 思路:逐个遍历到最后一个节点,过程记录路径是否相等,若相等则加入到总的大队列,
*
*/
//总的大队列,记录每一个符合条件的小队列
//这里不能用static修饰,
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是否满足条件
target-=root.val;
//如果遍历到的节点是叶子节点,且路径满足条件,则加入大队列
//注意:此时要新建另一个list和当前的list一样,否则递归的list都是一个list,遍历到最后会有问题
//此时可能回想:递归target会变,为什么不新建一个变量呢?其实不用,因为target作为参数传进去,
//每次都会被当前方法的局部变量表所存储,并指向,
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;
}
}