Algorithm πŸ§‘πŸ»‍πŸ’»/λ°±μ€€(BOJ)

[λ°±μ€€,c++] 5539번 - 이진 검색 트리

dkswnkk 2022. 6. 21. 20:57

문제

 

5639번: 이진 검색 트리

트리λ₯Ό μ „μœ„ μˆœνšŒν•œ κ²°κ³Όκ°€ μ£Όμ–΄μ§„λ‹€. λ…Έλ“œμ— λ“€μ–΄μžˆλŠ” ν‚€μ˜ 값은 106보닀 μž‘μ€ μ–‘μ˜ μ •μˆ˜μ΄λ‹€. λͺ¨λ“  값은 ν•œ 쀄에 ν•˜λ‚˜μ”© μ£Όμ–΄μ§€λ©°, λ…Έλ“œμ˜ μˆ˜λŠ” 10,000개 μ΄ν•˜μ΄λ‹€. 같은 ν‚€λ₯Ό κ°€μ§€λŠ” λ…Έλ“œλŠ” μ—†λ‹€

www.acmicpc.net

 

μ½”λ“œ

#include <iostream>
#include <vector>

using namespace std;

vector<int>v;

void postorder(int start, int end){
    if(start>end) return;
    if(start==end){
        cout<<v[start]<<'\n';
        return;
    }
    
    int root_index = start;
    while(true){
        root_index++;
        if(v[start]<v[root_index]) break;
        if(root_index>end) break;
    }
    
    postorder(start+1, root_index-1);
    postorder(root_index, end);
    cout<<v[start]<<'\n';   // λ£¨νŠΈλ…Έλ“œ 좜λ ₯
    
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    int inp;
    while(cin>>inp){
        v.push_back(inp);
    }
    
    postorder(0, v.size()-1);
    
}

 

풀이

μ΄μ§„νŠΈλ¦¬λ₯Ό μ „μœ„ μˆœνšŒν•œ κ²°κ³Όκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 이 트리λ₯Ό ν›„μœ„ μˆœνšŒν•œ κ²°κ³Όλ₯Ό 좜λ ₯ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

풀이 μ•„μ΄λ””μ–΄λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. 문제의 예제 μž…λ ₯κ³Ό 같은 λ‹€μŒ μž…λ ₯ μžˆμ„ λ•Œ, 각각 Root, Left, RightλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

50 30 24 5 28 45 98 52 60 

빨간색: Root, νŒŒλž€μƒ‰: Left, μ΄ˆλ‘μƒ‰: Right 

κ·Έ μ΄μœ λŠ” 일단 Root λ…Έλ“œλŠ” 50일 이고, 30λΆ€ν„° Left λ…Έλ“œμΈλ° Root보닀 처음으둜 큰 값이 λ‚˜μ˜€λ©΄ ν•΄λ‹Ή NodeλŠ” Right λ…Έλ“œμ˜ μ‹œμž‘μ μ΄ λ©λ‹ˆλ‹€.

λ”°λΌμ„œ ν•΄λ‹Ή 아이디어 λ°©μ‹μœΌλ‘œ 루트λ₯Ό 기점으둜 쒌우 μ–‘μͺ½μœΌλ‘œ λΆ„ν• ν•˜μ—¬ λ˜λ‹€μ‹œ 처음과 같은 방법을 λ°˜λ³΅ν•˜κ²Œ 되면 리프 λ…Έλ“œμ— λ„λ‹¬ν•˜κ²Œ λ˜λŠ”λ° κ·Έλ•Œ 리프 λ…Έλ“œλ₯Ό 좜λ ₯ν•˜λŠ” λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν•˜λ©΄ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.