코딩 테스트 준비! (백준)/TREE

[TREE] 백준 1991번 트리의 순회(C++)

lee-soo 2025. 5. 12. 17:27

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

 

트리 순회 문제다.

 

아마 개발자를 목표로 하는 취준생이나, 대학생 3~4학년이라면 당연히 전위 중위 후위순위에 대한 알고리즘을 알고 있을 거다.

 

간단히 설명하자면, 트리를 탐색할 때

문제에 나온 것처럼

 

루트 , 왼쪽자식 ,오른쪽 자식

순서대로 찾아볼거냐

 

왼쪽자식 루트 오른쪽 자식

 

or

 

왼쪽 오른쪽 루트 

 

방식으로 찾아볼거냐에 대한 것이다.

 

그래서 전위순회를 한 경우에는 

가장 먼저 A에서 시작하므로 루트 A를출력

그 이후 왼쪽노드로 넘어가면

B가 루트노드가되므로 B 출력

그 이후 D 가...

이렇게 반복하는 것이다

 

이런 문제는 재귀를 통해서 풀면 되는데

 

진입점에 따라 탐색 방식이 달라진다고 생각하면 된다.

 

예를들어

 

1.왼쪽노드 들어가기

2.오른쪽노드 들어가기

3.루트 탐색

이라는 선택지가 있다고 하자

 

전위순회는

3 -> 1-> 2

 

중위 순회는 

1->3->2

 

후위순회는

1->2->3

이다.

 

#include <iostream>
#include <queue>
#include <stack>
#include <vector>
using namespace std;
vector<char> v[27];
void pre(char temp);
void pos(char temp);
void ino(char temp);
int main()
{
    int n;
    cin >> n;

    for (int i = 1; i <= n; i++)
    {
        char parent, c1, c2;
        cin >> parent >> c1 >> c2;
        int par = parent - 'A' + 1;
        v[par].push_back(c1);
        v[par].push_back(c2);
    }
   
    pre('A');
    cout << "\n";
    pos('A');
    cout << "\n";
    ino('A');
}
void pre(char temp)
{
    cout << temp;
    int index = temp - 'A' + 1;
    for (int i = 0; i < 2; i++)
    {
        char child = v[index][i];

        if (!(child == '.'))
            pre(child);
    }
}
void pos(char temp)
{
    int index = temp - 'A' + 1;

    char child = v[index][0];
    if (!(child == '.'))
        pos(child);

    cout << temp;

    child = v[index][1];
    if (!(child == '.'))
        pos(child);
}
void ino(char temp)
{
    int index = temp - 'A' + 1;

    char child = v[index][0];
    if (!(child == '.'))
        ino(child);

    child = v[index][1];
    if (!(child == '.'))
        ino(child);
   
    cout << temp;
}

어렵지 않다.