PS

BOJ 1991 : 트리 순회

lickelon 2025. 2. 20. 23:58
  • 문제 링크 : boj.kr/1991
  • 난이도 : S1
  • 태그 : 트리, 재귀

코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

void traversal(vector<pii> tree, int node, int mode) {
    if(node == -19) return;
    auto [l, r] = tree[node];
    if(mode == -1) cout << (char)('A'+node);
    traversal(tree, l, mode);
    if(mode == 0) cout << (char)('A'+node);
    traversal(tree, r, mode);
    if(mode == 1) cout << (char)('A'+node);
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int n;
    cin >> n;
    vector<pii> tree(n);

    for(int i = 0; i < n; i++) {
        string a, b, c;
        cin >> a >> b >> c;
        tree[a[0]-'A'].first = b[0]-'A';
        tree[a[0]-'A'].second = c[0]-'A';
    }

    traversal(tree, 0, -1);
    cout << "\n";
    traversal(tree, 0, 0);
    cout << "\n";
    traversal(tree, 0, 1);
    cout << "\n";

    return 0;
}

풀이

재귀식 순회 코드를 이용하면 전위, 중위, 후위 순회의 코드는 언제 노드를 출력할 것인가 에서만 차이가 나게 된다.

따라서 순회의 종류를 검사하여 출력하도록 하면 하나의 코드를 이용하여 세 가지의 순회 모두 구현할 수 있다.

728x90