题目大意:给出一棵树,先序遍历,输出结果。最外层给一对括号,每个节点的孩子节点用()包起,若无孩子节点,直接输出()。
解题思路:递归,注意节点不一定是字母。若节点同列的下一行是 |,表示该节点有孩子,进入 dfs,无则直接输出括号。dfs(n, l ,r),n 表示当前层,l(l>0) 表示最左的节点,r 最右。距离根据 - 的长度来确定。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
char map[500][500];
void dfs(int n, int l, int r) {
printf("(");
for (int i = l; i < r; i++) {
if (map[n][i] != ' ' && map[n][i] != '#' && map[n][i] != '\0') {
printf("%c", map[n][i]);
if (map[n+1][i] == '|') {
int lef = i, rig = i;
while (map[n+2][lef] == '-') lef--;
while (map[n+2][rig] == '-') rig++;
if (lef < 0) lef = 0;
dfs(n+3, lef, rig);
}
else printf("()");
}
}
printf(")");
}
int main() {
int T;
scanf("%d", &T);
getchar();
while (T--) {
memset(map, 0, sizeof(map));
int n = 0;
while (gets(map[n])) {
if (map[n][0] == '#') break;
n++;
}
dfs(0, 0, strlen(map[0]));
printf("\n");
}
return 0;
}