\别人的答案 copy过来的 写下来主要是因为 对list要消除最后一个而sum不用消除的疑惑
因为int 是基本类型,其值在递归的栈中不同,而list在栈中存的是地址,所以其内容要手动修改!!

public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
    ans = new ArrayList<ArrayList<Integer>>();
    ArrayList<Integer> list = new ArrayList<>();
    solve(root, target, 0, list);
    return ans;
}
private ArrayList<ArrayList<Integer>> ans;
private void solve(TreeNode node, int target, int sum, ArrayList<Integer> list) {
    if (node != null) {
        sum += node.val;
        list.add(node.val);
        if (node.left == null && node.right == null) {
            if (sum == target) {
                ArrayList<Integer> res = new ArrayList<>(list); // ArrayList是引用传递
                ans.add(res);
            }
        } else {
            solve(node.left, target, sum, list); // 递归左子树
            solve(node.right, target, sum, list); // 递归右子树
        }
        // 消除掉当前节点对查找路径的影响 --> 至关重要
        ***list.remove(list.size() - 1);***
    }
}