这道题应该算是比较难的了,即涉及到了二叉树的知识,有涉及到了catalan数(具体请参照我的资源:http://download.youkuaiyun.com/detail/u011396840/7714447)
思路:首先根据catalan数的规律确定所需要的节点数,然后递归,不过要满足题目中给的条件!
参照别人的代码如下:
#include<stdio.h>
#define MAXN 19
int num[MAXN]={1,1}, snum[MAXN]={1,1}, n;
void GetMum(int n){ for(int i=0; i<n && (num[n]+=num[i]*num[n-1-i]) || (snum[n]=snum[n-1]+num[n],false); i++); }
void SplitNum(int offset, int l)
{
for(int cnt=0, i=0, offsetall=0, ni=0;
i<l && (cnt+=num[i]*num[l-1-i], cnt<offset) ||
(ni=l-1-i, offsetall=offset-cnt+num[i]*num[ni]-1,
i!=0 && (printf("("), SplitNum(offsetall/num[ni]+1, i), printf(")")),
printf("X"),
ni!=0 && (printf("("), SplitNum(offsetall%num[ni]+1, ni),printf(")")),
false);
i++);
}
int main()
{
for(int i=2; i<MAXN && (GetMum(i), true); i++);
while(scanf("%d", &n), n!=0)
for(int i=1; i<MAXN && (snum[i]<n) || (SplitNum(n-snum[i-1], i), printf("\n"), false); i++);
return 0;
}
牛人写的代码就是不一样,看着头大,不过我相信,看懂了是对c语言的一次提高!~~o(>_<)o ~~