例题:
由3 个结点可以构造出多少种不同的二叉树?
公式:Catalan(n)=C(2n,n)/(n+1)。
n为结点数。
C(2n,n)是排列的知识。
有题目可以得到n = 3
所以有 C(2*3,3)/(3+1) = ((6*5*4)/(3*2*1)) / 4 = 5;
题外话:一棵具有 n个结点的完全二叉树的树高度(深度)是log2(n+1).
以下是代码的实现
方法1
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll catalan(int n)
{
if(n < 0) return -1;
else if(n <= 1) return 1;
ll *tmp = new ll [n+1]; //放在堆中,防止栈溢出
tmp[0] = tmp[1] = 1;
for(int i = 2; i <= n; i++)
{
tmp[i] = 0;
for(int j = 0; j < i; j++)
tmp[i] += (tmp[j] * tmp[i-1-j]);
}
ll result = tmp[n];
delete [] tmp;
return result;
}
int main(){
printf("%I64d",catalan(16));
return 0;
}
方法2
#include<iostream>
#include<cstdio>
using namespace std;
long long tmp[1000];
long long catalan(int n){
tmp[0]=tmp[1]=1;
for(int i=1;i<=n;i++)
tmp[i]=(4*i-2)*tmp[i-1]/(i+1);
return tmp[n];
}
int main()
{
printf("%I64d",catalan(3));
return 0;
}