반응형

문제 출처 :


https://www.acmicpc.net/problem/1991



알고리즘 분석 :


문제 해결에 필요한 사항

1. Tree에 대한 이해

2. 포인터 배열


Tree에 대한 내용은 Crocus 홈페이지의 검색창에 Tree 혹은 트리를 치면 몇가지 내용이 나오기에 확인 해 보는 것을 추천한다.


이번 문제는 포인터 배열을 이용하여 해결하였다.


주석을 통해 달아 두기도 했지만, malloc을 통해 동적 할당을 하되, 


ptr['A']처럼 자연스럽게 아스키 코드로 변환되어 들어갈 수 있도록 적절하게 동적할당을 하였다.


그렇게 하여 makeTree 부분을 좀더 깔끔하게 표현하였고, 순회는 재귀를 이용하여 해결하였다.


소스 코드 : 


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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <iostream>
#include <cstdio>
 
using namespace std;
 
 
struct TREE
{
    char val;
    TREE *left;
    TREE *right;
};
 
TREE *ptr[30+'Z'];
void makeTree(char t1, char t2, char t3)
{
    ptr[t1]->val = t1;
 
    // .이 아니면 t2(t3) 값을 넣고, .이면 NULL값을 넣는다.
    if(t2 != '.')
        ptr[t1]->left = ptr[t2];
    else 
        ptr[t1]->left = NULL;
    if (t3 != '.')
        ptr[t1]->right = ptr[t3];
    else
        ptr[t1]->right = NULL;
 
}
 
 
void PreorderTraverse(int now)
{
    printf("%c", now);
    if (ptr[now]->left != NULL)
        PreorderTraverse(ptr[now]->left->val);
    if (ptr[now]->right != NULL)
        PreorderTraverse(ptr[now]->right->val);
 
}
 
 
void InorderTraverse(int now)
{
    if (ptr[now]->left != NULL)
        InorderTraverse(ptr[now]->left->val);
    printf("%c", now);
    if (ptr[now]->right != NULL)
        InorderTraverse(ptr[now]->right->val);
 
}
 
 
void PostorderTraverse(char now)
{
    if(ptr[now]->left != NULL)
        PostorderTraverse(ptr[now]->left->val);
    if (ptr[now]->right != NULL)
        PostorderTraverse(ptr[now]->right->val);
    printf("%c", now);
}
 
 
 
 
int main()
{
    TREE tree;
    int n;
    char t1, t2, t3;
    scanf("%d"&n);
 
    // ptr[i + 'A'] 의 의미는 포인터 배열에서 'A'의 아스키 코드값 부터
    // n만큼의 동적 할당을 해주고자 하는 것이다.
    // 이렇게 하여 ptr['A']처럼 바로 아스키 코드를 넣어주기 위해 이용하였다.
    for (int i = 0; i < n; i++)
    {
        ptr[i + 'A'= (TREE*)malloc(sizeof(TREE) + 1);
        ptr[i + 'A']->val = 'e';
    }
    
    for (int i = 0; i < n; i++)
    {
        cin >> t1 >> t2 >> t3;
        makeTree(t1, t2, t3);
    }
 
    // 전위, 중위, 후위 순회
    PreorderTraverse('A');
    cout << endl;
    InorderTraverse('A');
    cout << endl;
    PostorderTraverse('A');
    
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus

반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

[2609번] 최대공약수와 최소공배수  (0) 2017.01.08
[1668번] 트로피 진열  (0) 2017.01.08
[10866번] 덱  (0) 2016.12.29
[2217번] 로프  (0) 2016.12.22
[2501번] 약수 구하기  (0) 2016.12.22