#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 200+ 5;
char map[maxn][maxn];//存储读入的数据
int n;
void dfs(int r,int c)//r表示行,c表示列
{
printf("%c(", map[r][c]);
if (r + 1 < n&&map[r + 1][c] == '|')//判断是否存在子树
{
int i = c;
while (i - 1 >= 0 && map[r + 2][i - 1] == '-')i--;//因为相应字符对应输入,注意对齐输入时的特点以及格式,找到分隔行最左边
while (map[r + 2][i] == '-'&&map[r + 3][i] != '\0')//上下对应的判断,上一行控制读取的结束
{
if (!isspace(map[r + 3][i]))//不是空格符,则递归向下输出
{
dfs(r + 3, i);
}
i++;
}
}
printf(")");//注意每一层处理完整,返回之前加上括号,理解递归处理的强大作用
}
void solve()
{
n = 0;
while (1)
{
fgets(map[n], maxn, stdin);//注意按照行读入输入字符
if (map[n][0] == '#')break;
else
n++;
}
printf("(");//起始括号
if (n)
{
for (int i = 0; i < strlen(map[0]); i++)//读入根节点,进行递归直接输出
{
if (map[0][i] != ' ')
{
dfs(0, i); break;
}
}
}
printf(")\n");
}
int main()
{
int t;
fgets(map[0],maxn,stdin);//以字符形式读入case数,注意字符与数字的转换
sscanf(map[0], "%d", &t);//将转换的数字赋值给t
while (t--)
{
solve();
}
getchar();
getchar();
return 0;
}
1、又一次体会递归的强大作用,递归返回前注意补全格式,将根节点与其子节点处理完成后再进入下一个节点,理解解决二叉树以及多叉树问题中递归的思想方法
2、学习fgets函数的用法,fgets函数功能为:
从文件流读取一行,送到缓冲区,注意使用fgets函数时,对于读取字符个数的控制,fgets读取时能把空白字符同时读取进去,包括空白字符,fgets函数结尾为null控制,若不读取新的字符串,则下次调用fgets函数时仍然调用之前读取的内容
3、isspace函数的用法,用于判断是否存在空白字符,注意空白字符包括'\n'等字符,是一种判断的快捷处理方式
4、注意此题中输入的对应性,仔细观察题中节点表述的方式
5、sscanf函数的用法,用于格式的转变,此处将case以字符方式读入,注意将其转换为对应数字,同时可用于取出特定长度的字符串,并将其转换为对应的格式,sscanf函数是以相应的字符串作为输入源