题目描述
给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
样例
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
算法1
(动态规划) $O(n^2)$
对于$n$个节点的BST,除去根节点有$n - 1$个节点,将这$n - 1$个节点分配在根节点的两侧,即可构造出所有的方案。
递推公式即为: $f[n] = f[0] * f[n - 1] + f[1] * f[n - 2] + … + f[n - 1] * f[0]$
时间复杂度
$O(n)$个状态,每次状态计算需要$O(n)$时间,故$O(n^2)$
参考文献
C++ 代码
class Solution {
public:
int numTrees(int n) {
if (n <= 0) return 0;
vector<int> f(n + 1);
f[0] = 1; f[1] = 1;
for (int i = 2; i <= n; ++i){
for (int j = 0; j <= i - 1; ++j){
f[i] += f[j] * f[i - 1 - j];
}
}
return f[n];
}
};
算法2
(组合数) $O(n)$
其实这道题是求卡特兰数,所以直接按照卡特兰数公式即可。
时间复杂度
见代码,很容易看出是$O(n)$。
参考文献
C++ 代码
class Solution {
public:
int numTrees(int n) {
if (n <= 0) return 0;
long long res = 1;
for (int i = 1; i <= n; ++i){
res = res * (i + n) / i ;
}
return res / (n + 1);
}
};
牛
大佬太强了,清晰明了