[๋ฐฑ์ค€] #4325 ํŠธ๋ฆฌ๐ŸŒฒ

๋ฌธ์ œ

  • ์˜ˆ์‹œ

์–ด๋– ํ•œ ํŠธ๋ฆฌ๋ฅผ ์ „์œ„, ์ค‘์œ„ ์ˆœํšŒํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ๊ฐ ์ฃผ์–ด์ง€๊ณ , ์ด๋ฅผ ์ด์šฉํ•ด ํŠธ๋ฆฌ๋ฅผ ํ›„์œ„ ์ˆœํšŒํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

๋ถ„์„

์ฃผ์–ด์ง„ ์˜ˆ์‹œ๋ฅผ ๋ถ„์„ํ•ด๋ณด์ž.

  • ์ „์œ„ ์ˆœํšŒ : 3 6 5 4 8 7 1 2
  • ์ค‘์œ„ ์ˆœํšŒ : 5 6 8 4 3 1 2 7
  1. ์ „์œ„ ์ˆœํšŒ ๊ฒฐ๊ณผ์˜ ์ฒ˜์Œ ๊ฐ’ = 3 = ๋ฃจํŠธ ๋…ธ๋“œ

  2. ์ค‘์œ„ ์ˆœํšŒ ๊ฒฐ๊ณผ์—์„œ 3์„ ๊ธฐ์ค€์œผ๋กœ left tree์™€ right tree๊ฐ€ ๋‚˜๋‰จ : 5 6 8 4 3 1 2 7

  3. ์ „์œ„ ์ˆœํšŒ ๊ฒฐ๊ณผ์˜ ๋‘๋ฒˆ์งธ ๊ฐ’ = 6 = left tree์˜ ๋ฃจํŠธ ๋…ธ๋“œ

  4. 2์—์„œ ๊ตฌํ•œ left tree์—์„œ , 6 ์„ ๊ธฐ์ค€์œผ๋กœ left tree์˜ left , right๊ฐ€ ๋‚˜๋‰จ : 5 6 8 4

    ...๋ฐ˜๋ณต...

๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ left , right ํŠธ๋ฆฌ๊ฐ€ ๋ถ„๋ฆฌ๋˜๊ณ ,
left , right ํŠธ๋ฆฌ์—์„œ ๋‹ค์‹œ ๊ฐ๊ฐ์˜ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์ด ๋ฐ˜๋ณต๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿง™โ€โ™‚๏ธ ๋ถ„์„ ๊ฒฐ๊ณผ
๋™์ผํ•œ ์—ฐ์‚ฐ์ด ๋ฐ˜๋ณต - ์žฌ๊ท€
ํŠธ๋ฆฌ์˜ ํฌ๊ธฐ๊ฐ€ ์ ์  ์ž‘์•„์ง - divide and conquer


๊ตฌํ˜„ํ™”

ํŠธ๋ฆฌ ํ‘œํ˜„

  • ์ค‘์œ„ ์ˆœํšŒ์˜ ์ธ๋ฑ์Šค ๋ฒ”์œ„๋กœ ํ‘œํ˜„
  • ์˜ˆ์‹œ : 5 6 8 4 3 1 2 7 - left tree : (0, 3)

์žฌ๊ท€ ํ•จ์ˆ˜(first, last)

3 6 5 4 8 7 1 2
5 6 8 4 3 1 2 7

  1. base : if (first > last) โ†’ return
  2. ์ „์œ„ ์ˆœํšŒ์—์„œ ๋…ธ๋“œ ํ•˜๋‚˜์”ฉ ๊ฐ–๊ณ ์˜ด (๋งจ์•ž์—์„œ๋ถ€ํ„ฐ)
  3. ํŠธ๋ฆฌ์—์„œ ๋…ธ๋“œ์˜ ์œ„์น˜ ์ฐพ๊ธฐ(์ธ๋ฑ์Šค ์ฐพ๊ธฐ)
  4. ์ธ๋ฑ์Šค ๊ธฐ์ค€์œผ๋กœ ํŠธ๋ฆฌ๋ฅผ left, right๋กœ ๋‚˜๋ˆˆ ํ›„ ์žฌ๊ท€
    • ์žฌ๊ท€ํ•จ์ˆ˜(first, ์ธ๋ฑ์Šค -1)
    • ์žฌ๊ท€ํ•จ์ˆ˜(์ธ๋ฑ์Šค +1, last)
  5. ๋…ธ๋“œ ์ถœ๋ ฅ

์˜ˆ์‹œ
(0,7) โ†’ ํŠธ๋ฆฌ์—์„œ 3์˜ ์ธ๋ฑ์Šค : 4 โ†’ (0,3) , (5,7) โ†’ 3 ์ถœ๋ ฅ

์ฝ”๋“œ

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>

using namespace std;

int T,N;
int i, j;
int cur;
queue<int> preorder;
vector<int> inorder;

void init();
void printPostorder(int first, int last);

int main()
{
 
    cin >> T;   
    for(i=0;i<T;i++){
      
        init();
        
        for(j=0;j<N;j++){
            cin >> cur;
            preorder.push(cur);
        }
        for(j=0;j<N;j++){
            cin >> cur;
            inorder.push_back(cur);
        }
        
        printPostorder(0,N-1);
        cout << "\n";
    }

    return 0;
}

void init(){
    inorder.clear();
    cin >>N;
}

void printPostorder(int first, int last){
    if(first > last)
        return;
    
		//find root index
    auto begin = inorder.begin();
    auto end = inorder.end();
    auto root = preorder.front();
    preorder.pop();
    
    int rootIdx = distance(begin, find(begin,end,root));
    
    printPostorder(first,rootIdx-1) ;  // left tree
    printPostorder(rootIdx+1,last) ;   // right tree
    
    cout << root <<" ";
    
}

๋Š๋‚€ ์ 

์—ญ์‹œ ์žฌ๊ท€์— ๊ด€ํ•œ ๋ฌธ์ œ๋Š” base์™€ ์žฌ๊ท€๋ถ€๋ถ„๋งŒ ์„ค์ •์„ ์ž˜ํ•˜๋ฉด ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋Š๋‚„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
์š” ๊ทผ๋ž˜ ์Šคํ„ฐ๋””์—์„œ ์žฌ๊ท€ ๋ฌธ์ œ๋ฅผ ์ฃผ๋กœ ํ’€์—ˆ๋”๋‹ˆ ๊ธฐ์กด์— ์žฌ๊ท€์— ๋Œ€ํ•ด ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ํ˜ผ๋ž€์Šค๋Ÿฌ์›€์ด ์–ด๋Š ์ •๋„ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋ฟŒ๋“ฏํ•˜๋‹ค.

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ