解题思路:
动态规划
首先当结点数为1和0时设置树的个数为1
假设我已经求出来了结点数小于n的所有结果,现在当树的个数为n时,
树的根节点可以是1-n。
当树的根是i是,左边有i-1个节点,右边有n-i个节点,及当根是i时,可以有F[i-1]*F[n-i]颗树
遍历一遍1-n即可
提交代码:
class Solution {
public int numTrees(int n) {
int[] dp=new int[n+1];
dp[0]=1;dp[1]=1;
for(int i=2;i<=n;i++) {
for(int j=1;j<=i;j++)
dp[i]+=dp[j-1]*dp[i-j];
}
return dp[n];
}
}
运行结果: