Baekjoon Review

[Gold 4] 5639 이진 검색 트리

hanseongbugi 2024. 9. 20. 15:30

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

 

문제에서 입력은 이진 탐색 트리의 전위 순회의 결과로 주어진다.

이때 입력의 종료 조건은 트리의 순회 결과가 모두 들어올때 까지 이다.

따라서 반복의 조건에 입력이 끝날때 까지 받도록 한다.

while(cin>>input){
        tree[idx++] = input;
}

 

전위 순회의 결과를 보면 왼쪽 노드의 값은 루트보다 작으며, 오른쪽 노드의 값은 루트보다 큰 것을 알 수 있다.

따라서 루트보다 작은 것은 왼쪽 노드이며, 루트보다 큰 것은 오른쪽 노드이다.

위 정의는 부모 자식 노드간의 관계에도 성립한다.

따라서 입력 배열의 현재 위치와 그 다음 인덱스의 값이 작으면 왼쪽 노드로 생각하고 크면 오른쪽 노드로 생각하면 된다.

 

 

 

#include <iostream>
using namespace std;

int tree[10000];

void postOrder(int start, int end){
    if(start >= end)
        return;
    if(start == end - 1){
        cout<<tree[start]<<'\n';
        return;
    }

    int idx = start + 1;
    while(idx < end){
        if(tree[start] < tree[idx])
            break;
        idx++;
    }
    postOrder(start + 1, idx);
    postOrder(idx, end);
    cout<<tree[start]<<'\n';
}

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

    int input;
    int idx = 0;
    while(cin>>input){
        tree[idx++] = input;
    }
    postOrder(0, idx);
}