본문 바로가기
ALGORITHM/C++ - 백준

[백준 1991] 트리 순회

by DDongYeop 2023. 10. 19.
728x90

문제 

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

 

1991번: 트리 순회

첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파

www.acmicpc.net

 

 

문제 분석 

입력 받아 트리를 만들고 그 트리를 전위, 중위, 후위 순서대로 순회하여 값을 출력하는 간단한 문제이다. 

 

 

알고리즘 설계 

몇 가지의 노드가 있는지 입력 받고, 노드와 연결된 노드를 입력받아 이중 vector에 넣어준다. 

 

이후 전위, 중위, 후위 순회를 하여 출력해준다. 

 

 

유의점 

전위, 중위, 후위 순회에 간단한 이해가 필요한 문제이다. 

 

 

코드

#include <iostream>
#include <vector>

using namespace std;

vector<vector<int>> vec;

void PreorderTraverse(int index);
void InorderTraverse(int index);
void PostorderTraverse(int index);

int main()
{
    int index;
    char c1, c2, c3;
    cin >> index;
    vec.resize(index, vector<int>(2, -1));

    while (index--)
    {
        cin >> c1 >> c2 >> c3;
        if (c2 != '.')
            vec[c1 - 'A'][0] = (c2 - 'A');
        if (c3 != '.')
            vec[c1 - 'A'][1] = (c3 - 'A');
    }

    PreorderTraverse(0);
    cout << '\n';
    InorderTraverse(0);
    cout << '\n';
    PostorderTraverse(0);
}

void PreorderTraverse(int index)
{
    cout << (char)(index + 'A');
    if (vec[index][0] != -1)
        PreorderTraverse(vec[index][0]);
    if (vec[index][1] != -1)
        PreorderTraverse(vec[index][1]);
}

void InorderTraverse(int index)
{
    if (vec[index][0] != -1)
        InorderTraverse(vec[index][0]);
    cout << (char)(index + 'A');
    if (vec[index][1] != -1)
        InorderTraverse(vec[index][1]);
}

void PostorderTraverse(int index)
{
    if (vec[index][0] != -1)
        PostorderTraverse(vec[index][0]);
    if (vec[index][1] != -1)
        PostorderTraverse(vec[index][1]);
    cout << (char)(index + 'A');
}
728x90

'ALGORITHM > C++ - 백준' 카테고리의 다른 글

[백준 5635] 생일  (0) 2023.10.19
[백준 11047] 동전 0  (0) 2023.10.19
[백준 5639] 이진 검색 트리  (0) 2023.10.18
[백준 11725] 트리의 부모 찾기  (1) 2023.10.18
[백준 1068] 트리  (0) 2023.10.18

댓글