import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {

    ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();

    /**
     * 
     * @param root TreeNode类 
     * @param sum int整型 
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> pathSum (TreeNode root, int sum) {

        if (root == null) {
            return result;
        }

        ArrayList<Integer> list = new ArrayList<Integer>();

        treeDeep(root, sum, list);

        return result;
    }

    public void treeDeep (TreeNode root, int sum, ArrayList<Integer> list) {

        if (root == null) {
            return;
        }

        //不能这么写 因为有可能整棵树都是负数 要求的sum也是负数
//         if (sum < 0) {
//             return;
//         }

        if (root.left == null && root.right == null && sum - root.val == 0) {
            list.add(root.val);
            result.add(new ArrayList(list));
            //如示例中的二叉树 如sum=10时 541 此时遍历到4的左孩子1叶子节点后,应把1擦除,接着遍历4的右孩子 看是否有路径满足sum=10的
            list.remove(list.size() - 1);
            return;
        }

        list.add(root.val);

        treeDeep (root.left, sum - root.val, list);

        treeDeep (root.right, sum - root.val, list);

        //这里的擦除 如sum=11 当遍历到1时 不满足sum=11 此时 应擦除1 接着遍历4的右孩子到叶节点 看是否有满足的
        list.remove(list.size() - 1);

    }
}