题目:https://vjudge.net/problem/UVA-10562

解题思路:


用char buf[][]存储输入,fegts(buf[],maxn,stdin)读取每一行的输入,注意每一行输入的末尾是结束符'\0'

先找到后代的起点下标,再往后依次遍历

注意:

1.cin第一个数字后,要用getchar()吃掉紧跟的换行符,否则会被buf[0]读取出错

2.不用单独建树,边dfs边输出

3.-下面除了有结点字符和空格外,还会有结束符'\0',参见题目的第二个例子!!

 

ac代码:


#include <iostream>
#include <cmath>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
#define maxn 210
#define inf 1e+9+10
using namespace std;
typedef long long ll;
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]=='|')//有子树
    {
        int i=c;
        while(i-1>=0&&buf[r+2][i-1]=='-')
            i--;//寻找----的左边界
        while(buf[r+2][i]=='-'&&buf[r+3][i]!='\0')
        {
            if(!isspace(buf[r+3][i]))
                dfs(r+3,i);//  \n也满足if条件
            i++;
        }
    }
    printf(")");
}
void solve()
{
    n=0;
    for(;;)
    {
        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(")\n");
}
int main()
{
    //freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);
    //ios::sync_with_stdio(false);
    int t;
    cin>>t;
    getchar();
    //fgets(buf[0],maxn,stdin);
    //sscanf(buf[0],"%d",&t);
    while(t--)
        solve();
    return 0;
}