๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm ๐Ÿง‘๐Ÿป‍๐Ÿ’ป/๋ฐฑ์ค€(BOJ)

[๋ฐฑ์ค€,c++] 5539๋ฒˆ - ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ

by ์•ˆ์ฃผํ˜• 2022. 6. 21.

๋ฌธ์ œ

 

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 ๋…ธ๋“œ์˜ ์‹œ์ž‘์ ์ด ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ•ด๋‹น ์•„์ด๋””์–ด ๋ฐฉ์‹์œผ๋กœ ๋ฃจํŠธ๋ฅผ ๊ธฐ์ ์œผ๋กœ ์ขŒ์šฐ ์–‘์ชฝ์œผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ๋˜๋‹ค์‹œ ์ฒ˜์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋˜๋ฉด ๋ฆฌํ”„ ๋…ธ๋“œ์— ๋„๋‹ฌํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ๊ทธ๋•Œ ๋ฆฌํ”„ ๋…ธ๋“œ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€