想法
一开始没想出来,看题解才知道是动态规划,具体的做法是:
两个节点的时候,两个节点生成的二叉树,等于以1为顶点生成的二叉树,以2为顶点生成的二叉树。
G(2)=f(1)+f(2)=2;
G(3)=f(1)+f(2)+f(3)=5;
f(i)实际上可以这么理解,假设由n个节点,那么i作为节点,比i小的有f(i-1)个节点,比i大的有n-i个。
也就说说,可以理解为:
f(i)=G(i-1)*G(n-i)
所以,因此可以推导出来:
G(n)=G(0)*G(n-1)+G(1)*G(n-2)+…+G(n-1)*G(0)
初始条件:G(0)=1;G(1)=1;
所以,利用动态规划得出。
class Solution {
public int numTrees(int n) {
int [] dp=new int[n+1];
dp[0]=1;
dp[1]=1;
for(int j=2;j<=n;j++){
for(int i=1;i<=n;i++){
dp[j]+=dp[i-1]*dp[n-i];
}
}
return dp[n];
}
}