Algorithm/BOJ

[BOJ] #1991 트리 순회

jHoon0223 2024. 1. 5. 18:11

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

 

1991번: 트리 순회

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

www.acmicpc.net


재귀함수를 활용하여 이진트리의 전위,중위,후위 순회를 출력하는 문제이다. 트리의 입력값도 사전에 다 주고, N의 개수도 최대 26까지이기 때문에 크게 까다로운 점은 없었다.

다만 이 문제에서의 핵심 포인트는 처음 루트값이 A라는 것을 활용하여 다른 자식 노드들을 따로 알파벳으로 접근하지 않고 pair<char, char>형의 배열의 인덱스로서 접근, 참조하는 것인데, 처음 풀때는 이 부분이 조금 이해가 가질 않았다. 하지만 이해하고 난 뒤에는 너무도 당연한 원리라 할 수 있다. 굳이 알파벳으로 노드를 참조하지 않아도 되는 이유는, 루트 노드를 제외한 모든 노드들은 어차피 부모 노드가 존재하기 때문에, 제일 조상 노드인 A를 활용하여 A노드의 자식들을 first, second인자로 참조하여 (pair<char,char>형이기에 left, right가 아닌 first, second로 사용하게 된다.) 접근하기 때문이다. 이를 활용하면, 맨 처음 조상인 A만 알파벳으로 참조하고, 그 이후에는 A의 자식 노드들을 재귀형태로 참조하면서 알고리즘이 돌아가게 된다.

#include <iostream>

using namespace std;

pair<char, char> arr[26];

void preOrder(char c) {
    if (c != '.') {
        cout << c;
        preOrder(arr[c-'A'].first);
        preOrder(arr[c-'A'].second);
    }
}

void inOrder(char c) {
    if (c != '.') {
        inOrder(arr[c-'A'].first);
        cout << c;
        inOrder(arr[c-'A'].second);
    }
}

void postOrder(char c) {
    if (c != '.') {
        postOrder(arr[c-'A'].first);
        postOrder(arr[c-'A'].second);
        cout << c;
    }
}

int main() {
    int N;
    cin >> N;

    while(N-->0) {
        char parent, left, right;
        cin >> parent >> left >> right;

        arr[parent-'A'].first = left;
        arr[parent-'A'].second = right;
    }

    preOrder('A');
    cout << endl;
    inOrder('A');
    cout << endl;
    postOrder('A');
    cout << endl;

    return 0;
}

 

728x90

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] #1260 DFS와 BFS  (0) 2024.01.06
[BOJ] #5639 이진 검색 트리  (0) 2024.01.05
[BOJ] #11723 집합  (0) 2024.01.04
[BOJ] #1302 베스트셀러  (0) 2023.12.20
[BOJ] #2346 풍선 터뜨리기  (0) 2023.11.02