class Solution {
public List<TreeNode> generateTrees(int n) {
ArrayList<TreeNode>[] dp = new ArrayList[n + 1];
dp[0] = new ArrayList<TreeNode>();
if (n == 0)
return dp[0];
dp[0].add(null);
for (int len = 1; len <= n; len++) {
dp[len] = new ArrayList<TreeNode>();
for (int i = 1; i <= len; i++) {
int left = i - 1, right = len - i;
for (TreeNode leftNode : dp[left]) {
for (TreeNode rightNode : dp[right]) {
TreeNode treeRoot = new TreeNode(i);
treeRoot.left = leftNode;
treeRoot.right = clone(rightNode, i);
dp[len].add(treeRoot);
}
}
}
}
return dp[n];
}
private TreeNode clone(TreeNode n, int i) {
if (n == null)
return null;
TreeNode node = new TreeNode(n.val + i);
node.left = clone(n.left, i);
node.right = clone(n.right, i);
return node;
}
}