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 {
    //记录路径
    static ArrayList<ArrayList<Integer>> result=new ArrayList();
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
        ArrayList<Integer> curArryList=new ArrayList();
        fun(curArryList,root,target);
        return result;
    }
    public void fun(ArrayList<Integer> curArrayList,TreeNode root,int target){
        if(root==null){
            return;
        }
        //如果该节点为叶子节点
        if(root.left==null&&root.right==null&&root!=null){
            //如果可达
            if(target-root.val==0){
                ArrayList mycur=new ArrayList();
                for (Integer x:curArrayList) {
                    mycur.add(x);
                }
                mycur.add(root.val);
                target-=root.val;

                result.add(mycur);
                System.out.println("收入:"+root.val+" 新目标:"+target+" 路径:"+mycur+" 路径集:"+result);
                return;
            }
        }
        //如果不是叶子节点
        else{
            //curArrayList.add(root.val);
            //target=target-root.val;
            //不可达
            if(target-root.val<=0){
                return;
            }
            //可以走
            else{
                ArrayList mycur=new ArrayList();
                for (Integer x:curArrayList) {
                    mycur.add(x);
                }
                mycur.add(root.val);
                target=target-root.val;
                //System.out.println("收入:"+root.val+" 新目标:"+target+" 路径:"+curArrayList);
                //把当前路径和新的目标值传给下一个节点
                fun(mycur,root.left,target);
                fun(mycur,root.right,target);
            }
        }
    }
}