발상
우선 전위 탐색을 통해 얻은 tree가 주어지므로, 이를 배열에 입력받는다.
그리고 아래 그림과 같은 이분 탐색을 거치면, 후위 탐색으로 배열을 바꿀 수 있다.
전위 탐색 : root -> left -> right
후위 탐색 : left -> right -> root 이므로
순서를 바꾸어준다.
소스코드
#include <iostream>
#include <vector>
using namespace std;
int tree[10001];
void postorder(int start, int end){
if(start == end) {
cout << tree[start] << "\n";
return;
}
if(start>end) return;
int i = start+1;
while(true){
if(tree[start]<tree[i] || i>end){
break;
}
i++;
}
postorder(start+1,i-1);
postorder(i,end);
cout << tree[start] << "\n";
}
int main(){
cin.tie(NULL); ios::sync_with_stdio(false);
int num;
int count = 0;
while(cin >> num){
tree[count++] = num;
}
postorder(0, count-1);
return 0;
}
search하는 재귀함수 postorder만 살펴보면 다음과 같다.
void postorder(int start, int end){
if(start == end) {
cout << tree[start] << "\n";
return;
}
if(start>end) return;
int i = start+1;
while(true){
if(tree[start]<tree[i] || i>end){
break;
}
i++;
}
postorder(start+1,i-1);
postorder(i,end);
cout << tree[start] << "\n";
}
strart와 end를 받아주고,
1) tree의 start와 end가 같으면 해당 tree를 출력해준다. (tree의 크기가 1) 그리고 return하여 탐색을 종료한다.
2) tree의 start보다 end가 작으면 탐색을 종료한다.
3) 둘 다 해당하지 않는 경우: tree[start]와 start+1부터의 요소의 크기를 비교하여 tree보다 큰 지점이 나오면 탐색을 종료한다. 이 떄의 i가 처음 tree보다 큰 값이 등장하는 node이므로,
postorder(start+1, i-1)
postorder(i, end)
를 수행하여 left -> right 순으로 탐색해 준다.
마지막으로 root를 출력한다.
'solving > C, C++' 카테고리의 다른 글
[백준] 11660번 구간 합 구하기 5 (C++) - 간단한 dp (0) | 2023.03.21 |
---|---|
[백준] 1912번 연속합 (C++) - 간단한 dp (0) | 2023.03.21 |
[백준] 1991번 트리 순회 (C++) - preorder, inorder, postorder (0) | 2022.11.21 |
[백준] 1325번 효율적인 해킹 - C++ (DFS, 그래프) (0) | 2022.11.10 |
[백준] 11724번 연결 요소의 개수 - C++ (DFS, 그래프) (0) | 2022.11.10 |