package niuke;
import java.util.ArrayList;
public class SumRoute {
/*输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
(注意: 在返回值的list中,数组长度大的数组靠前)*/
ArrayList<ArrayList<Integer>> a = new ArrayList<>(); //设置为全局变量函数结束,变量并不会随之消失
ArrayList<Integer> al = new ArrayList<>();
public static void main(String[] args) {
}
//在使用递归的时候,例如此题,要注意到叶子节点也是有左右节点的只不过是空节点,所以可以一直递归,直到遇到空节点。不管是否是有效路径都可以直到遇到空节点。当符合
//条件时,就新建一个内容与al相同的list加进去。
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root == null) { //节点为空的话,则返回,此函数结束运行
return a;
}
al.add(root.val); //不论是否符合条件都把节点的值添加到al后面
target = target - root.val; //修改目标值
if(target == 0 && root.left == null && root.right == null) { //此时如果能满足目标值等于0,并且是叶子节点,则把al添加到a中
a.add(new ArrayList<>(al));
}
FindPath(root.left,target); //即便root已经是叶子节点,则也需要调用
FindPath(root.right,target);
al.remove(al.size()-1); //删除al后最后节点进行回退
return a;
}
}