给定一个A,那么只能构建一棵二叉树。给定两个A和B,可以构建四棵不同的二叉树。如图所示:
假设输入一个字母,那么它即为二叉树的根节点。输入N个字母时,选定一个作为根节点,那么如果没有左子树,右子树就有N-1个节点,如果左子树有1个节点,右子树就有
N-2个节点。所以h(n) = h(0)*h(n-1)+h(1)*h(n-2)+...+h(n-1)*h(0)中不同的二叉树结构,再乘以n的阶乘,即全排列(N的阶乘)。正好是卡特兰数的表达式,化简得(2n)!/(n+1)!
需要用到大数乘法
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define Max 1000
using namespace std;
int a[Max];
int mod = 10000;
int digits = 1;
int mul(int a[],int n) //大数乘法
{
int carry =0;
for(int i = n+2;i<=2*n;i++) {
carry = 0;
for(int j = 0;j<digits;j++) {
a[j] = a[j]*i+carry;
carry = a[j]/mod;
a[j]%=mod;
}
if(carry>0) {
a[digits++] = carry;
}
}
return 0;
}
int main()
{
int N;
while(scanf("%d",&N)!=EOF && N)
{
memset(a,0,sizeof(a));
a[0] = 1;
mul(a,N);
printf("%d",a[digits-1]);
for(int i = digits-2;i>=0;i--) {
printf("%04d",a[i]);
}
printf("\n");
}
return 0;
}