给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
这个题目是非常典型的动态规划题目,先不说官方题解中后面推导出来的什么数学上的卡特兰数,就前面的动态规划推导过程和思路讲解,我感觉就是非常好的一个解决思路,值得学习。
代码实现比较简单,重点是前面的推导思路。
推导思路:
解题代码:
int numTrees(int n){
if (n == 0 || n == 1) {
return 1;
} else if (n == 2) {
return 2;
}
int *G = (int *)malloc(sizeof(int) * (n + 1));
memset(G, 0, (n + 1) * sizeof(int));
int i, j;
int ret;
G[0] = 1;
G[1] = 1;
G[2] = 2;
for (i = 3; i < n + 1; i++) {
for (j = 1; j < i + 1; j++) {
G[i] += G[j - 1] * G[i - j];
}
}
ret = G[n];
free(G);
G = NULL;
return ret;
}