private void helper(TreeNode root, int sum, LinkedList<Integer> curtPath, ArrayList<ArrayList<Integer>> rst) {

    if (root == null) {
      return;
    }

    if (sum - root.val == 0 && root.left == null && root.right == null) {
      // rst.add((ArrayList<Integer>) curtPath.clone());
      ArrayList<Integer> path = new ArrayList<Integer>();
      for (int i : curtPath) {
        path.add(i);
      }
      path.add(root.val);
      rst.add(path);
    }

    // coolest part
    curtPath.addLast(root.val);
    helper(root.left, sum - root.val, curtPath, rst);
    helper(root.right, sum - root.val, curtPath, rst);
    curtPath.removeLast();
  }