题目链接:QAQ
题意:按题目意思构造顺序,输出第n个二叉树
思路:n个结点组成的二叉树个数满足卡特兰数,这样就可以找到第n个树含几个节点,然后递归构造即可
附上代码:
#include<cstdio>
long long num[25];
long long s[25];
void solve(int um, int x) {
if (x == 1) {
printf("X");
return;
}
if (x == 0) {
return;
}
int num1=um;
int i, j;
for (i = x-1, j = 0; i >= 0; i--, j++) {
if (num1 > num[i] * num[j]) {
num1 -= num[i] * num[j];
}
else
break;
}
num1--;
if (j != 0) {
printf("(");
solve(num1 / num[i]+1, j);//注意这里要加一
printf(")");
}
printf("X");
if (i != 0) {
printf("(");
solve(num1%num[i]+1, i);
printf(")");
}
return;
}
int main(void) {
long long tot;
num[0] = 1;num[1] = 1;num[2] = 2;num[3] = 5;
s[0] = 0; s[1] = 1; s[2] = 3; s[3] = 8;
for (int z = 4; z <= 19; z++) {
tot = 0;
for (int i = z-1, j = 0; i >= 0; i--, j++) {
tot += num[i] * num[j];
}
num[z] = tot;
s[z] = s[z - 1] + tot;
}
int n;
while (scanf("%d", &n) != EOF) {
if (n == 0) break;
int i;
for (i = 1; i <= 19; i++) {
if (s[i] >= n) break;
}
solve(n-s[i-1], i);
printf("\n");
}
return 0;
}