9도 OJ 1078: 두 갈래 나무 범람(두 갈래 나무)

시간 제한: 1초
메모리 제한: 32메가바이트
특수 판제: 아니요
제출: 3748
해결 방법: 2263
제목 설명:
두 갈래 나무의 전순, 중순, 후순 반복의 정의: 전순 반복: 모든 하위 나무에 대해 먼저 접근한 다음에 왼쪽 하위 나무를 반복한 다음에 오른쪽 하위 나무를 반복한다.중서 반복: 어떤 하위 나무에 대해 왼쪽 하위 나무를 먼저 훑어본 다음에 뿌리를 방문하고 마지막으로 오른쪽 하위 나무를 훑어본다.뒷차례 훑어보기: 어떤 하위 나무에 대해 먼저 왼쪽 하위 나무를 훑어본 다음에 오른쪽 하위 나무를 훑어보고 마지막에 뿌리를 방문한다.두 갈래 나무의 전차적 역류와 중차적 역류를 정하고 후차적 역류를 구한다.
입력:
두 문자열의 길이는 n이 26보다 작다.첫 번째 행위는 앞뒤로, 두 번째 행위는 앞뒤로.두 갈래 나무의 결점 이름은 대문자로 A, B, C...최대 26개의 결점.
출력:
샘플을 입력하면 여러 그룹이 있을 수 있습니다. 각 그룹의 테스트 샘플에 대해 한 줄을 출력하고 뒷순서로 흐르는 문자열을 출력합니다.
샘플 입력:
ABC
BAC
FDXEAG
XDEFAG

샘플 출력:
BCA
XEDGAF

출처:
2006년 청화대학 컴퓨터 연구 생기시험 진제
생각:
트리를 복원할 필요는 없습니다. 직접 전순과 중순으로 구하면 됩니다.
주로 세 가지 반복적인 정의를 분명히 하는 것이다.
코드:
#include <stdio.h>
#include <string.h>
 
//void print(char *s, int len)
//{
//  for (int i=0; i<len; i++)
//      printf("%c", s[i]);
//  printf("
"); //}   void getAfter(char *b, char *m, char *a, int len) {     if (len == 1)     {         a[0] = b[0];         return;     }       int root = b[0];     int i;     for (i=0; i<len; i++)     {         if (m[i] == root)             break;     }       a[len-1] = root;     //print(b, len);     //print(m, len);     //print(a, len);     if (i > 0)         getAfter(b+1, m, a, i);     if (len-1-i > 0)         getAfter(b+1+i, m+1+i, a+i, len-1-i); } int main(void) {     char b[30], m[30], a[30];     int len;     while (scanf("%s", b) != EOF)     {         scanf("%s", m);           len = strlen(b);         //for (int i=0; i<len; i++)         //  a[i] = '0';         getAfter(b, m, a, len);         a[len] = '\0';           printf("%s
", a);     }       return 0; } /**************************************************************     Problem: 1078     User: liangrx06     Language: C     Result: Accepted     Time:0 ms     Memory:912 kb ****************************************************************/

좋은 웹페이지 즐겨찾기