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
需要知识点:
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
相关文章推荐
- C语言指针数组与数组指针
- 【java】同步、异步、阻塞、非阻塞
- SQL扩展之T-SQL中的数据查询语言之选择查询篇
- 进阶新的阶段--LCD
- hdu 5459 Jesus Is Here 沈阳网赛
- Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用
- WPF 每次只打开一个窗口
- NSMutableString的用法和注意事项
- IOS 网络开发框架
- 中国剩余定理 互质与不互质两种
- J2SE--容器
- 顶级会议
- IDA Pro Disassembler 6.8.15.413 (Windows, Linux, Mac)
- ios自动监测更新
- ARM板卡ftp客户端应用
- 一维数组的内部存储方法
- 小程序猿都找到了工作经验的方式
- mysql压力测试
- Lecture3-1Learning with different data label
- 路径中 斜杠/和反斜杠\ 的区别