본문 바로가기

Coding Test

백준 5639 이진 검색 트리

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

 

5639번: 이진 검색 트리

트리를 전위 순회한 결과가 주어진다. 노드에 들어있는 키의 값은 106보다 작은 양의 정수이다. 모든 값은 한 줄에 하나씩 주어지며, 노드의 수는 10,000개 이하이다. 같은 키를 가지는 노드는 없다

www.acmicpc.net

 

#include <iostream>
#include <vector>

using namespace std;

vector<int> tree;

void postorder(int s, int e){

    if (s >= e) {
        return;
    }
    if (s == e - 1) {
        cout << tree[s] << "\n";
        return;
    }
    int cur = s + 1;
    while (cur < e) {
        if (tree[s] < tree[cur]) {
            break;
        }
        cur++;
    }

    postorder(s + 1, cur);
    postorder(cur, e);
    cout << tree[s] << "\n";

}

int main() {

    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int n;

    while (cin >> n) {
        tree.push_back(n);
    }

    postorder(0, tree.size());

    return 0;
}

 

입력 순서대로 배열에 추가한다. 

preorder는 루트->좌->우, postorder는 좌->우->루트 순이므로 다음과 같이 처리한다.

 

  1. s는 루트 노드이다. 루트 다음의 노드를 cur로 잡고(이는 좌측 child 노드이다) cur을 하나씩 증가시켜가면서 우측 child 노드를 찾는다.(이진 검색트리의 정의에 의해 s보다 더 큰 값이 처음 나오는 쪽이 우측 child 노드이다)

  2. 찾았다면 postorder의 정의에 따라 좌측 노드(s+1, cur), 우측 노드(cur, e), root(print(tree[s])) 순으로 재귀를 돌린다.

 

 

while(cin>>n){
	tree.push_back(n);
}

 

  이 문제를 풀면서 입력의 개수가 주어지지 않는 문제에 입력을 받는 법을 몰랐다(혹은 까먹었던 걸수도 있다).

위의 코드는 입력값이 유효한 값이 들어오는 동안만 입력을 받는 코드이다.

 

'Coding Test' 카테고리의 다른 글

백준 15657 N과 M(8)  (1) 2024.04.01
백준 2467 용액  (0) 2024.04.01
백준 9342 염색체  (0) 2024.03.29
백준 15685 드래곤 커브  (0) 2024.03.28
백준 1277 발전소 설치  (0) 2024.03.27