leetcode官方的题解:https://leetcode-cn.com/problems/unique-binary-search-trees/solution/bu-tong-de-er-cha-sou-suo-shu-by-leetcode/
(写的真好)
class Solution {
public:
int numTrees(int n) {
if(n < 1) return 1;
vector<int>G(n+1,0);
G[0] = 1;
G[1] = 1;
for(int i = 2; i <= n; i++)
{
for(int j = 1; j <= i; j++)
{
G[i] += G[j-1]*G[i-j];
}
}
return G[n];
}
};
class Solution {
public:
int numTrees(int n) {
typedef long long ll;
ll C = 1; // C_0 = 1
for(int i = 0; i < n; i++)
{// C_1 = C_(n+1) ⇒ n = 0 ,故 从0开始
C = C*(2*(2*i + 1))/(i+2);
}
return C;
}
};
===================================================================
补充:
catalan数:https://en.wikipedia.org/wiki/Catalan_number
因为一开始看到那个Catanlan
数的时候,感到有点奇怪,我记得这个公式是算不同的二叉树的个数的,后面才发现这个公式也是算不同形态的二叉树的个数的,也就是说二叉树一种形态对应一颗二叉搜索树。
比如: 给你3
个数(1、2、3
?),这个形态的二叉树是不是只有唯一的二叉搜索树。
结论:
同一形态可以有n!
颗不同的二叉树,即:countBST(n)
= 第n
个Catalan
数,countBT(n) = countBST(n)*n!
,countBT(n)
是n
个不同key
的值能组成不同二叉树的个数(注意:不是不同形态的二叉树的总数)