卡特兰数加递归,没想到能1A。 卡特兰数的含义有很多,其中一个是n个节点的二叉树的数目。卡特兰数的求法是c(2n,n)/(n+1)。于是我们能用卡特兰数来加快运算。直接求出给定数的二叉树含有几个节点。然后自己写个递归,返回指定数n的树。 #include<iostream> #include<string> using namespace std; int c[20]= { 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700 }; string tree(int n) { if(n==0) return ""; if(n==1) return "X"; int num=1,cnt,ll=1,i; string rec; while(n>c[num]) { n-=c[num]; num++; } for(cnt=0;cnt<=num-1;cnt++) { if(n<=c[cnt]*c[num-1-cnt]) break; n-=c[cnt]*c[num-1-cnt]; } if(cnt==0) { rec="X("; for(i=1;i<num-1;i++) n+=c[i]; rec+=tree(n); rec+=")"; return rec; } else { if(cnt==num-1) { rec="("; for(i=1;i<num-1;i++) n+=c[i]; rec+=tree(n); rec+=")X"; return rec; } else { while(n>c[num-1-cnt]) { ll++; n-=c[num-1-cnt]; } for(i=1;i<cnt;i++) ll+=c[i]; for(i=1;i<num-1-cnt;i++) n+=c[i]; rec="("; rec+=tree(ll); rec+=")X("; rec+=tree(n); rec+=")"; return rec; } } } int main() { int n; while(scanf("%d",&n),n) { cout<<tree(n)<<endl; } return 0; }