import java.util.ArrayList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
public int sum(List<Integer> list) {
return list.stream().reduce(0, (s1, s2) -> s1 + s2);
}
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
if (root == null) {
return list;
}
Stack<TreeNode> queue = new Stack<>();
Stack<ArrayList<Integer>> paths = new Stack<>();
queue.push(root);
ArrayList<Integer> vals = new ArrayList<>();
vals.add(root.val);
paths.push(vals);
while (!queue.isEmpty()) {
TreeNode node = queue.pop();
ArrayList<Integer> path = paths.pop();
if (node.left == null && node.right == null && sum(path) == target) {
list.add(path);
}
if (node.right != null) {
queue.push(node.right);
ArrayList<Integer> integers = new ArrayList<>(path);
integers.add(node.right.val);
paths.add(integers);
}
if (node.left != null) {
queue.push(node.left);
ArrayList<Integer> integers = new ArrayList<>(path);
integers.add(node.left.val);
paths.push(integers);
}
}
return list;
}
}