- ๋ฐฑ์ค #4325 ํธ๋ฆฌ
- ์ฌ์ฉ์ธ์ด : C++
- ๋ฌธ์ ๋ฑ๊ธ : ๊ณจ๋ โ ข ๐ฅ
์ด๋ ํ ํธ๋ฆฌ๋ฅผ ์ ์, ์ค์ ์ํํ ๊ฒฐ๊ณผ๊ฐ ๊ฐ๊ฐ ์ฃผ์ด์ง๊ณ , ์ด๋ฅผ ์ด์ฉํด ํธ๋ฆฌ๋ฅผ ํ์ ์ํํ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
์ฃผ์ด์ง ์์๋ฅผ ๋ถ์ํด๋ณด์.
3 6 5 4 8 7 1 2
5 6 8 4 3 1 2 7
์ ์ ์ํ ๊ฒฐ๊ณผ์ ์ฒ์ ๊ฐ = 3
= ๋ฃจํธ ๋
ธ๋
์ค์ ์ํ ๊ฒฐ๊ณผ์์ 3
์ ๊ธฐ์ค์ผ๋ก left tree์ right tree๊ฐ ๋๋จ : 5 6 8 4
3
1 2 7
์ ์ ์ํ ๊ฒฐ๊ณผ์ ๋๋ฒ์งธ ๊ฐ = 6
= left tree์ ๋ฃจํธ ๋
ธ๋
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
if (first > last)
โ return
์์
(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์ ์ฌ๊ท๋ถ๋ถ๋ง ์ค์ ์ ์ํ๋ฉด ๊ฐ๋จํ ํด๊ฒฐ๋๋ค๋ ๊ฒ์ ๋๋ ์ ์์๋ค.
์ ๊ทผ๋ ์คํฐ๋์์ ์ฌ๊ท ๋ฌธ์ ๋ฅผ ์ฃผ๋ก ํ์๋๋ ๊ธฐ์กด์ ์ฌ๊ท์ ๋ํด ๊ฐ์ง๊ณ ์๋ ํผ๋์ค๋ฌ์์ด ์ด๋ ์ ๋ ํด๊ฒฐ๋๋ ๊ฒ ๊ฐ์ ๋ฟ๋ฏํ๋ค.