int numTrees(int n) {
if(n<=0) return 0;
vector<int> dp(n+1,0);
dp[0] = 1;
dp[1] = 1;
for(int i=2;i<=n;i++){ //node个数
for(int j=1;j<=i;j++){ //left的个数
dp[i] += dp[j-1]*dp[i-j];
}
}
return dp[n];
}
public class Solution {
public ArrayList<TreeNode> generateTrees(int n) {
return helper(1,n);
}
public ArrayList<TreeNode> helper(int beg,int end){
ArrayList<TreeNode> res = new ArrayList<TreeNode>();
if(beg>end){
res.add(null);
return res;
}
for(int i=beg;i<=end;i++){ //枚举中间点
ArrayList<TreeNode> left = helper(beg,i-1);
ArrayList<TreeNode> right = helper(i+1,end);
for(int j=0;j<left.size();j++){ //左子树的根
for(int k=0;k<right.size();k++){ //右子树的根
TreeNode root = new TreeNode(i);
root.left = left.get(j);
root.right = right.get(k);
res.add(root);
}
}
}
return res;
}
}