一个长度为n的序列组成的二叉搜索树总数等于以每个数字为根节点形成的搜索树的集合之和,而对于每个数字为根节点所形成的搜索树之和=左子树形成的集合个数*右子树形成的集合个数。而对于右子树形成的集合个数,若右子树序列长度为len,则就等于1到len形成的搜索树集合的个数,因为序列是递增。(举个例子,即1到5与6到10形成的搜索树个数相当)。所以g[n]为长度为n的序列形成的搜索树个数。
代码如下:
class Solution {
public:
int g[10000];
int numTrees(int n) {
g[0]=1;//初始条件
for(int i=1;i<=n;i++){ //1到i所组成的二叉搜索树个数,也即长度为n的序列组成的搜索树个数
for(int j=1;j<=i;j++){ //以j为根节点
g[i]+=g[j-1]*g[i-j]; //左子树个数*右子树个数
}
}
return g[n];
}
};