您的位置:首页 > 其它

hdu1100:Trees Made to Order

2015-09-20 11:40 453 查看

需要知识点:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: