1 求指定节点数的二叉搜索树的种数
给你一个整数n,求由值为1到n的这n个节点能组成互不相同的二叉搜索树的种数。
- **方法一:**卡塔兰数【时间复杂度O(N),空间复杂度O(1)。】
原理:任何长度的不同二叉搜索树的种类递推公式为:
C
n
+
1
=
C
n
∗
2
(
2
n
+
1
)
/
(
n
+
2
)
C~n+1~ = C~n~ * 2(2n+1)/(n+2)
C n+1 =C n ∗2(2n+1)/(n+2)
typedef long long ll;
class Solution
{
public:
int num_trees(int n)
{
ll ret = 1;
for(int i=1; i<n; i++)
ret = ret * 2 * (2*n+1) / (i+2);
return ret;
}
};
- **方法二:**DP推理法
原理:假设在n个节点中,选取任意一个节点i作为根节点,则其左子树为1到i-1的节点组成,右子树为i+1到n的节点组成,所以i节点作为根节点时的二叉搜索树的种类是其左右子树种类的乘积。因此,所求问题转化为:
G ( n ) = G ( i − 1 ) ∗ G ( n − i − 1 ) G(n) = G(i-1) * G(n-i-1) G(n)=G(i−1)∗G(n−i−1)在i取值从1到n的累计和。
#include <stdc++.h>
using namespace std;
class Solution
{
public:
int num_trees(int)
{
vector<int> sum(n+1);
sum[0] = 1;
sum[1] = 1;
for(int i = 2; i <= n; i++)
for(int j = 1; j<=i; j++)
sum[i] += sum[j-1] * sum[i-j];
}
return sum[n];
}