문제 보러가기 : https://www.acmicpc.net/problem/2263
이번 문제는 재귀 알고리즘 문제였습니다.
중위 순회(In-Order) : 루트 노드 전까지 왼쪽 부분 트리이고 루트 노드가 나온 이후부터는 오른쪽 부분 트리
후위 순회(Post-Order) : 가장 마지막 노드가 루트 노드
각 순회마다 정점을 순회하는 순서는 다음과 같습니다.
✨ 전위 순회 : root -> left -> right
✨ 중위 순회 : left -> root -> right
✨ 후위 순회 : left -> right -> root
《문제 풀이》
1. 인오더와 포스트오더를 각각 배열에 입력
2. idx 배열에 인오더 배열의 인덱스를 순서에 맞게 저장
3. 인오더와 포스트오더의 시작 정점, 끝 정점을 이용하여 preOrder( ) 수행
(1) 포스트오더 배열의 끝은 루트 노드이므로 출력
(2) 루트 노드의 왼쪽 서브 트리에서 preOrder( ) 수행
(3) 루트 노드의 오른쪽 서브 트리에서 preOrder( ) 수행
《C++ 코드》
#include <bits/stdc++.h>
#define MAX 100001
using namespace std;
int n;
int inOrder[MAX], postOrder[MAX];
int idx[MAX];
void preOrder(int inBegin, int inEnd, int postBegin, int postEnd) {
// 무한 출력 방지
if (inEnd < inBegin || postEnd < postBegin)
return;
// postOrder 배열의 끝은 루트 노드
int root = postOrder[postEnd];
cout<<root<<" ";
// left
preOrder(inBegin, idx[root] -1, postBegin, postBegin + (idx[root] - inBegin) - 1);
// right
preOrder(idx[root] + 1, inEnd, postBegin + (idx[root] - inBegin), postEnd - 1);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
for(int i=0; i<n; i++)
cin>>inOrder[i];
for(int i=0; i<n; i++)
cin>>postOrder[i];
// inOrder 배열의 인덱스 저장
for(int i=0; i<n; i++)
idx[inOrder[i]] = i;
preOrder(0, n-1, 0, n-1);
return 0;
}
개발 환경: Dev-C++
반응형
'알고리즘 > BOJ' 카테고리의 다른 글
백준 1120번 문자열 (0) | 2021.03.07 |
---|---|
백준 12852번 1로 만들기 2 (0) | 2021.03.01 |
백준 11404번 플로이드 (0) | 2021.02.21 |
백준 11779번 최소비용 구하기 2 (0) | 2021.02.17 |
백준 9935번 문자열 폭발 (0) | 2021.02.15 |