본문 바로가기
Algorithm/C

Baekjoon Online Judge _ 01991 _ 트리순회

by autumnly 2016. 11. 2.

[ Baekjoon Online Judge _ 01991 _ 트리순회 ]


문제

이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.

예를 들어 위와 같은 이진 트리가 입력되면,

  • 전위 순회한 결과 : ABDCEFG // (루트) (왼쪽 자식) (오른쪽 자식)
  • 중위 순회한 결과 : DBAECFG // (왼쪽 자식) (루트) (오른쪽 자식)
  • 후위 순회한 결과 : DBEGFCA // (왼쪽 자식) (오른쪽 자식) (루트)

가 된다.

입력

첫째 줄에는 이진 트리의 노드의 개수 N(1≤N≤26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 영문자 대문자로 매겨지며, 항상 A가 루트 노드가 된다. 자식 노드가 없는 경우에는 .으로 표현된다.

출력

첫째 줄에 전위 순회, 둘째 줄에 중위 순회, 셋째 줄에 후위 순회한 결과를 출력한다. 각 줄에 N개의 알파벳을 공백 없이 출력하면 된다.

예제 입력 

7
A B C
B D .
C E F
E . .
F . G
D . .
G . .

예제 출력 

ABDCEFG
DBAECFG
DBEGFCA







풀이

처음에는 struct 만들어서 링크드리스트로 표현하려 했으나

입력을 받아서 트리를 만드는 게 너무 복잡했다.

그래서 배열로 표현했는데!

쉽게 표현할 수 있지만 단점은 메모리를 많이 차지한다는 거다.

N의 개수가 최대 26개이기 때문에 최악의 경우 배열의 크기가 (2^26 -1) = 67,108,863  대략 64MB 가 된다.

좋은 방법은 아닌 것 같지만 일단 제출해서 한번에 통과 ! 런타임 에러 뜰줄알았는데 한번에 통과했다 !!! 처음이당

MAX_N은 임시로 1000으로 잡았지만 N이 커지면 에러가 날 것이다ㅜㅜ

다음엔 링크드리스트로 표현해봐야겠다.



코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <stdio.h>
#define MAX_N 1000
 
void PreOrder(char *tree, int index);   //전위순회
void InOrder(char *tree, int index);    //중위순회
void PostOrder(char *tree, int index);  //후위순회
int Search(char *tree, char data);
 
int main() {
    int N, index;
    char data;
    char tree[MAX_N + 1= {'\0', };
 
    scanf("%d"&N); //N: 1~26
    
    //트리만들기
    for(int i = 1; i <= N; i++){
        scanf(" %c"&data);
 
        index = Search(tree, data); //해당문자가있는 인덱스를찾음
        if (index == 0) {  //배열에 해당문자가 없을때(root를뜻함)
            index = 1;
            tree[index] = data;
        }
 
        scanf(" %c"&data);
        if (data == '.');
        else tree[2 * index] = data;
 
        scanf(" %c"&data);
        if (data == '.');
        else tree[2 * index + 1= data;
    }
    
    PreOrder(tree, 1);
    printf("\n");
    InOrder(tree, 1);
    printf("\n");
    PostOrder(tree, 1);
    printf("\n");
    return 0;
}
 
 
void PreOrder(char *tree, int index) {
    if (tree[index] != '\0') {
        printf("%c", tree[index]);
        PreOrder(tree, 2 * index);
        PreOrder(tree, 2 * index + 1);
    }
}
 
void InOrder(char *tree, int index) {
    if (tree[index] != '\0') {
        InOrder(tree, 2 * index);
        printf("%c", tree[index]);
        InOrder(tree, 2 * index + 1);
    }
}
 
void PostOrder(char *tree, int index) {
    if (tree[index] != '\0') {
        PostOrder(tree, 2 * index);    
        PostOrder(tree, 2 * index + 1);
        printf("%c", tree[index]);
    }
}
 
int Search(char *tree, char data) {
    int index = 0;
 
    if (tree[1== '\0')return 0;  //트리가비었을때 0반환
    //배열을 돌며 해당 문자를 찾음
    while (index++ <= MAX_N)     
        if (tree[index] == data) return index;
 
}
cs


Github

https://github.com/gaeulautumn/Baekjoon_Online_Judge.git