poj 1095 递归(Catalan)
来源:互联网 发布:淘宝华佗大药房保真吗 编辑:程序博客网 时间:2024/05/23 11:00
题意:将二叉树编号,给定一个数字,求其对应的二叉树。
思路:递归。题目中蕴含了Catalan数,即结点数为n的二叉树的不同形态为第n个Catalan数。所以先筛出前几个Catalan数,然后求得n对应应该有多少个结点,并求出其在相应节点数中的序号。随后递归处理:求出其左右子树应该具有的节点个数及其在相应的结点个数下得序号。
#include <stdio.h>#include <string.h>long long c[20],sum[20];int n;void catalan(){ int i,j; memset(c, 0, sizeof(c)); memset(sum, 0, sizeof(sum)); c[0] = c[1] = sum[1] = 1; for(i = 2;i<20;i++){ for(j = 0;j<i;j++) c[i] += c[j]*c[i-1-j]; sum[i] = c[i]+sum[i-1]; }}void solve(int x,int num){ int i,j,t = 0,a,b; if(x == 1){ printf("X"); return; } for(i = 0;i<x;i++){ t += c[i]*c[x-1-i]; if(num <= t) break; } t = c[i]*(c[x-1-i])-(t-num); a = (t-1)/c[x-1-i]+1; b = (t-1)%c[x-1-i]+1; if(i){ printf("("); solve(i,a); printf(")"); } printf("X"); if(i<x-1){ printf("("); solve(x-1-i, b); printf(")"); }}int main(){ catalan(); while (scanf("%d",&n) && n){ int i; for(i = 1;i<20;i++){ if(n<=sum[i]) break; } solve(i,n-sum[i-1]); printf("\n"); } return 0;}
0 0
- poj 1095 递归(Catalan)
- Catalan number(POJ:2084)
- poj 1095 catalan and binary tree
- POJ 2084 (Catalan数)
- poj 2084 Catalan数
- catalan数 + 二叉树 —— POJ 1095
- POJ-2084(Catalan数专题)(Game of Connections )
- poj 2084/3982 java大数(Catalan数)
- POJ 2084 Catalan数+高精度
- POJ 1979(递归)
- catalan数(poj1095)
- HDU1023(Catalan数)
- hdu1023(catalan问题)
- Catalan数(一)
- Catalan数(二)
- 卡塔兰数(Catalan)
- acm-Catalan(卡塔兰数)
- Catalan数(卡塔兰数)
- (算法设计技巧与分析)BinarySearchrec
- 黑马程序员——Java基础 GUI (2)
- TCP的定时器系列 — 保活定时器
- LeetCode-Number of 1 Bits
- 登录界面 Android简单http get请求(含服务器端)三
- poj 1095 递归(Catalan)
- 项目中使用Quartz集群分享--转载
- 大型测试开发交流大会
- ROW_NUMBER() OVER函数的基本用法用法
- HDU 1019 Least Common Multiple
- C++11多线程学习记录(一)
- Prim算法和Kruskal算法
- MINA学习第一节
- hosts文件