-
백준(BOJ) 1991번 트리 순회알고리즘 풀이/백준(Boj) 2019. 8. 18. 18:28
문제: https://www.acmicpc.net/problem/1991
문제이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.
예를 들어 위와 같은 이진 트리가 입력되면,
- 전위 순회한 결과 : ABDCEFG // (루트) (왼쪽 자식) (오른쪽 자식)
- 중위 순회한 결과 : DBAECFG // (왼쪽 자식) (루트) (오른쪽 자식)
- 후위 순회한 결과 : DBEGFCA // (왼쪽 자식) (오른쪽 자식) (루트)
가 된다.
나의 풀이:
입력에 항상 A가 루트 노드가 된다라는 조건이 있기 때문에 따로 루트 노드를 구할 필요가 없는 문제였다. 배열을 만들어서 A- Z를 인덱
스 [0] ~ [26] 으로 생각하고 자식 노드들을 넣는다. 순회 방식은 자료구조에서 배웠던 것 처럼 preOrder : V L R // InOrder L V R
// postORder L R V 식으로 순회하며 답을 출력한다. 순회하면서 '.'이 온다면 NULL 이라는 의미임으로 탐색을 종료한다.
'A'- 'A' = 0
0 + 'A' = 'A'
코드 ( C ++ )
#include <iostream>
#include <vector>
using namespace std;
int N;
const int MAX = 26;
int parent[MAX];
vector<vector<char>> Tree;
void preOrder(char root)
{
// '.' 이라면 탐색종료
if (root == '.')
return;
char left =Tree[root-'A'][0];
char right =Tree[root-'A'][1];
printf("%c", root);
preOrder(left);
preOrder(right);
}
void InOrder(char root)
{
if (root == '.')
return;
// [0] 이 왼쪽 , [1]이 오른쪽 자식이 될 것
char left = Tree[root - 'A'][0];
char right = Tree[root - 'A'][1];
InOrder(left);
printf("%c", root);
InOrder(right);
}
void postOrder(char root)
{
if (root == '.')
return;
char left = Tree[root - 'A'][0];
char right = Tree[root - 'A'][1];
postOrder(left);
postOrder(right);
printf("%c", root);
}
int main()
{
cin >> N;
Tree = vector<vector<char>>(N, vector<char>());
for (int i = 0; i < N; ++i)
{
char a, b, c;
cin >> a >> b >> c;
// 왼쪽자식, 오른쪽자식을 넣어준다.
Tree[a - 'A'].push_back(b);
Tree[a - 'A'].push_back(c);
}
preOrder(0 + 'A');
cout << endl;
InOrder(0 + 'A');
cout << endl;
postOrder(0 + 'A');
return 0;
}
'알고리즘 풀이 > 백준(Boj)' 카테고리의 다른 글
백준(BOJ) 3020번 개똥벌레 (0) 2019.08.22 백준(BOJ) 10828번 스택 (0) 2019.08.18 백준(BOJ) 2644번 촌수계산 (0) 2019.08.18 백준(BOJ) 1707번 이분 그래프 (0) 2019.08.17 백준(BOJ) 1049번 기타줄 (0) 2019.08.16