可以用DFS来做。
找到子树的根,进行深搜。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cctype>
using namespace std;
const int maxn = 200 + 10;
int n;
char buf[maxn][maxn];
void dfs(int x, int y)
{
cout << buf[x][y] << '(';
if(x + 1 < n && buf[x + 1][y] == '|') //存在“|”,有子树
{
int i = y;
while(i - 1 >= 0 && buf[x + 2][i - 1] == '-') i--; //找到子树的左边界
while(buf[x + 2][i] == '-' && buf[x + 3][i] != '\0')
{
if(!isspace(buf[x + 3][i])) //查找子树根。 +3 是因为子树结点与他的父节点相差3行
{
dfs(x + 3, i);
}
i++;
}
}
cout << ')';
}
void fun()
{
n = 0;
while(true)
{
gets(buf[n++]);
if(buf[n - 1][0] == '#')
{
n--;
break;
}
}
cout << "(";
if(n)
{
int len;
len = strlen(buf[0]);
for(int i = 0; i < len; i++) //找到整棵树的根节点
if(buf[0][i] != ' ')
{
dfs(0, i);
break;
}
}
cout << ')' << endl;
}
int main()
{
// freopen("1.txt", "r", stdin);
int t;
cin >> t;
getchar(); //吸收上一次输入的换行
while(t--)
{
fun();
}
return 0;
}