比较坑爹的一个题,节点不一定为字母,而且可能为空节点(需输出“()”),除去这两个地方比较恶心,个人感觉这还是比较好的一个树的递归题。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
char a[200+2][200+2];
int cct;
void dfs(int x, int y)
{
int i, j, k;
for(i = y; a[x][i] == '-'; i ++)
if(a[x+1][i] != ' ' && a[x+1][i] != '\0')
{
printf("%c(", a[x+1][i]);
if(x + 1 < cct&& a[x + 2][i] == '|')
{
for(j=i; j && a[x+3][j-1] == '-'; j --);
dfs(x+3, j);
}
printf(")");
}
}
int main()
{
#ifdef state
freopen("sample.txt","r",stdin);
#endif
int num,i;
scanf("%d",&num);
getchar();
while(num--)
{
cct = 1;
memset(a, 0, sizeof(a));
while(1)
{
gets(a[cct++]);
if(!strcmp(a[cct-1], "#"))
break;
}
cct--;
if(cct == 1) // 树为空时,需要特殊处理
puts("()");
else
{
int i,len = strlen(a[1]);
for(i = 0; i < len; i ++)
a[0][i] = '-';
printf("(");
dfs(0, 0);
printf(")\n");
}
}
return 0;
}