需要知识点:
1、卡特兰数
2、二叉树排序
3、迭代
#include<cstdio>
#include<cstring>
int catalan[] = {1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,
742900,2674440,9694845,35357670,129644790,477638700 };
void sprite(int nodenum,int order){
int s=0;
if(nodenum==1){
printf("X");
return;
}
int i=0;
while(s<order){
s+=catalan[i]*catalan[nodenum-i-1];
i++;
}
int leftnum,rightnum; //leftnum=min(i|(catalan[0]*catalan[nodenum-1]+...+catalan[i]*catalan[nodenum-i-1]);
leftnum=i-1;
rightnum=nodenum-leftnum-1;
int leftorder,rightorder,neworder;
neworder=order-(s-catalan[leftnum]*catalan[rightnum]);
if(leftnum>0){
printf("(");
leftorder=(neworder-1)/catalan[rightnum]+1; //catalan[rightnum]相当于一个进制
sprite(leftnum,leftorder);
printf(")");
}
printf("X");
if(rightnum>0){
printf("(");
rightorder=(neworder-1)%catalan[rightnum]+1;
sprite(rightnum,rightorder);
printf(")");
}
}
int main()
{
int n;
while(~scanf("%ld",&n)&&n){
int s=0;
int i;
i=1;
while(s<n){
s+=catalan[i];
i++;
}
int nodenum=i-1;
int order=n-(s-catalan[nodenum]);
sprite(nodenum,order);//nodenum 节点个数 order 为在该节点个数下的位置或序号 =属于(1,2,3,4,5....)
printf("\n");
}
return 0;
}
读者若要详细的可以到: http://www.bubuko.com/infodetail-384974.html