给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-binary-search-trees
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
对于这个题,我们可以首先找找规律,再决定递推式:
我们使用t[i]来表示一共有i个节点时,不同的树的棵数。
当 n=1时,毫无疑问只有一棵不同的树,t[1]=1。
当n=2时,又可以分为两种情况,以1为根的时候,有一棵不同的树,以2为根的时候,有一棵不同的树,故n=2时,有两棵不同的树,t[2] = 2。
当n=3时,可以分为3种情况,以1为根的时候,其子节点都在根的右边,此时其子树等于n=2的情况,只是节点的值不同,以2为根的时候,其子节点在其两边,一边一个,此时所有不同的树的棵树等于左边乘以右边,即t[1] * t[1] = 1,以3为根的时候,其子节点都在左边,此时其子树等于n=2的情况,故t[3] = 2*t[2] + t[1]*t[1] = 5。
当n=4时,可以分为4种情况,以1为根的时候,其子节点都在根的右边,此时其子树等于n=3的情况,只是节点的值不同,以2为根的时候,其子节点在其两边,左边一个右边两个,此时所有不同的树的棵树等于左边乘以右边,即t[1] * t[2] = 2,以3为根的时候,其子节点在其两边,左边两个右边一个,此时所有不同的树的棵树等于左边乘以右边,即t[2] * t[1] = 2,以4为根的时候,其子节点都在左边,此时其子树等于n=3的情况,故t[4] = 2*t[3] + t[1]*t[2] +t[2]*t[1] = 14。
……
直到这里,我们就可以发现递推的规律了,即:
t[n] = SUM(2 * t[i-1] +SUM( t[j-1]*t[i-j] )) i从3到n,n>=3,j从2到i-1。
代码如下:
class Solution {
public int numTrees(int n) {
if(n==1){
return 1;
}
if(n==2){
return 2;
}
int g[] = new int[n+1];
g[1] = 1;
g[2] = 2;
for(int i = 3;i<=n;i++){
g[i] = g[i] +2*g[i-1];
for(int j = 2;j<i;j++){
g[i] +=g[j-1]*g[i-j];
}
}
return g[n];
}
}