반응형
문제 출처 :
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 |