直接递归遍历输出就可以,不用建立二叉树,每4行一次递归。输入的方法注意,直接用scanf和cin读取次数T都是直接运行错误,必须用fgets来读取。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <string>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <stack>
#include <queue>
#include <bitset>
#include <cassert>
using namespace std;
const int maxn = 205;
int n;
char buf[maxn][maxn];
// 递归遍历输出以buf[r][c]为根的树
void dfs(int r, int c)
{
printf("%c(", buf[r][c]);
if (r + 1 < n && buf[r + 1][c] == '|') { // r不是最后一行,并别下面有子树
int i = c;
// 找到“---"的左边界
while (i - 1 >= 0 && buf[r + 2][i - 1] == '-') {
i--;
}
while (buf[r + 2][i] == '-' && buf[r + 3][i] != ' ') {
if (!isspace(buf[r + 3][i])) {
dfs(r + 3, i);
}
i++;
}
}
printf(")");
}
// 输入数据并从根开始dfs求解
void solve()
{
n = 0;
while (1) {
fgets(buf[n], maxn, stdin);
if (buf[n][0] == '#') {
break;
}
else {
n++;
}
}
printf("(");
if (n) {
for (int i = 0; i < strlen(buf[0]); i++) {
if (buf[0][i] != ' ') {
dfs(0, i);
break;
}
}
}
printf(")
");
}
int main()
{
ios::sync_with_stdio(false);
int T;
fgets(buf[0], maxn, stdin);
sscanf(buf[0], "%d", &T);
while (T--) {
solve();
}
return 0;
}