import java.util.*;
import java.util.ArrayList;
/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @param sum int整型 
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> pathSum (TreeNode root, int sum) {
        // write code here
        ArrayList <ArrayList<Integer>> res=new  ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> path=new ArrayList<Integer>();
        if(root==null)return res;
        path.add(root.val);
        dfs(root,sum,path,res);
        return res;
    }
    public static void dfs(TreeNode root,int sum,ArrayList path,ArrayList <ArrayList<Integer>> res){
        if (root.left==null&&root.right==null &&sum(path)==sum){
            res.add(new ArrayList<>(path));

        }
        if (root.left!=null){
            path.add(root.left.val);
            dfs(root.left,sum,path,res);
            path.remove(path.size()-1);//此处注意,和Python不同,需要自行移除
        }
        if (root.right!=null){
            path.add(root.right.val);
            dfs(root.right,sum,path,res);
            path.remove(path.size()-1);
        }

    }
    public static int sum(ArrayList list){//自己写一个求和函数
        int s=0;
        for(Object i:list){
            s+=(int)i;
        }
        return s;
    }
}