class Solution {
HashMap<Integer, List<TreeNode>> memo = new HashMap<>();
public List<TreeNode> allPossibleFBT(int n) {
if(n == 0)
return new ArrayList<TreeNode>();
if(n == 1)
return new ArrayList<TreeNode>(Arrays.asList(new TreeNode(0)));
if(memo.containsKey(n))
return memo.get(n);
List<TreeNode> res = new ArrayList<>();
for(int l = 0; l < n; l++){
int r = n-1-l;
List<TreeNode> leftTree = allPossibleFBT(l);
List<TreeNode> rightTree = allPossibleFBT(r);
for(TreeNode t1 : leftTree){
for(TreeNode t2 : rightTree){
res.add(new TreeNode(0, t1, t2));
}
}
}
memo.put(n, res);
return res;
}
}