uva 10562 Undraw the Trees

//提交通过,时间0.008,本题主要是字符串处理,以及层序建树,以及前序(DFS递归)

//遍历3个知识点,细节问题是字符串的处理,以及空树的处理

 

#include <stdio.h>

#include <string.h>

#define MAX 40010

struct tree

{

    char data;

    int l,r;  //最左边的孩子下标和最右边的孩子下标

    int x,y;  //它自身在最开始的字符矩阵中的列和行,x是列,y是行

}tree[MAX];

char string[210][210];

char stack[MAX];  int top,line;



void input()

{

    int i=1;

    while(1)

    {

        gets(string[i]);

        if(!strcmp(string[i],"#")) break;

        i++;

    }

    line=i;

//    for(i=1; i<line; i++) printf("%s\n",string[i]);

}

void test_print(int n)

{ int i; for(i=0; i<n; i++) printf("%c  %d  %d\n",tree[i].data , tree[i].l , tree[i].r);}

void create_tree()

{

    int front=0,rear=0,i,j,X,Y,L,R;

    for(i=0; string[1][i]!='\0'; i++) if( string[1][i]!=' ' && string[1][i]!='|' && string[1][i]!='#') break;

    tree[rear].data=string[1][i]; tree[rear].x=i; tree[rear].y=1; tree[rear].l=tree[rear].r=-1; rear++;

    while(front<rear)

    {

        Y=tree[front].y; X=tree[front].x;  L=R=-1;

        if( (Y+1)<line && string[Y+1][X]=='|')  //有孩子

        {

            L=rear;

            Y=Y+2;   //既然有孩子就扫描再下面的那行

            for(i=X; i>=0; i--)  if(string[Y][i]!='-') break; X=i+1;

            for(i=X; string[Y][i]=='-' && string[Y+1][i]!='\0'; i++ ) 

                if(string[Y+1][i]!=' ' && string[Y+1][i]!='|' && string[Y+1][i]!='#') 

                { 

                    tree[rear].data=string[Y+1][i]; 

                    tree[rear].l=-1; tree[rear].r=-1; 

                    tree[rear].y=Y+1; tree[rear].x=i; 

                    rear++;

                }

            R=rear-1;

            tree[front].l=L; tree[front].r=R;

        } 

        front++;

    }

//    test_print(rear);

}

void dfs(int s)

{

    int i;

    if(s==-1)  return ;

    stack[++top]=tree[s].data;

    stack[++top]='(';

    for(i=tree[s].l; i<=tree[s].r; i++) dfs(i);

    stack[++top]=')';

    return ;

}

int main()

{

    int i,n,T;

    scanf("%d",&T); getchar();

    while(T--)

    {

        input();

        if(!strcmp(string[1] , "#"))  {printf("()\n"); continue;}

        create_tree();

        top=-1; stack[++top]='('; i=0; 

        dfs(i); 

        stack[++top]=')'; stack[++top]='\0';

        printf("%s\n",stack);

    }

    return 0;

}

 

 

你可能感兴趣的:(tree)