📦2263: 트리의 순회
[알고리즘 풀이] 강동규
Reviewed by Kade Kang (devkade12@gmail.com)
Reviewed:: 2024-02-20
문제 확인하기
풀이
- Preorder : 루트 - 왼쪽 - 오른쪽
- Inorder : 왼쪽 - 루트 - 오른쪽
- Postorder : 왼쪽 - 오른쪽 - 루트
- 따라서, Postorder의 맨마지막 출력은 Preorder의 루트 노드가 된다.
- 그리고, 위 성질을 이용해서 각 부분 별로 왼쪽과 오른쪽의 루트를 재귀적으로 구해나간다.
- 즉, Inorder의 경우 왼쪽, 오른쪽의 기준을 잡기 위해 필요하고 Postorder는 루트를 구하기 위해 필요하다.
#include <iostream>
#define endl '\n'
using namespace std;
int n;
int preorder[100001];
int inorder[100001];
int postorder[100001];
void Input(){
cin >> n;
for(int i = 1; i <= n; i++){
cin >> inorder[i];
}
for(int i = 1; i <= n; i++){
cin >> postorder[i];
}
}
void Solution(int begin1, int end1, int begin2, int end2){
if(begin1 > end1 && begin1 > end2) return;
int root = postorder[end2];
int flag = -1;
for(int i=begin1; i <= end1; i++){
if(inorder[i]==root) {
flag = i;
break;
}
}
int len = flag - begin1;
cout << root << ' ';
Solution(begin1, flag-1, begin2, begin2+len-1);
Solution(flag+1, end1, begin2+len, end2-1);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
Input();
Solution(1, n, 1, n);
return 0;
}