dp思想:
二叉搜素树的可能性有取每一个点作为根节点
该0-i-1 为左子树的所有可能,i+1-n为所有右子树的可能 二者相乘并且累加每一个根节点
举例 f[4] = f[0]*f[3]+f[1]*f[2]+f[2]*f[1]+f[3]*f[0]
public int numTrees(int n) {//dp
int f[] = new int[n+1];
f[0]=1;
for (int i = 1; i < n+1; i++) {
for (int j = 1; j < i+1 ; j++) {
f[i]+=f[j-1]*f[i-j];
}
}
return f[n];
}
数学思想
卡特兰数公式
public int numTrees2(int n) {//卡特兰数
long C=1;//防止溢出
for (int i = 2; i < n+1; i++) {
C=C*(4*i-2)/(i+1);
}
return (int) C;
}