Post List

[BOJ] 백준 2263 트리의 순회

문제링크 : https://www.acmicpc.net/problem/2263

이 문제는 트리의 성질을 이용해서 풀어야 하는 문제이다.

중위순회, 후위순회 순서가 주어진다.

이때, 후위순회에서 맨 마지막에 있는 원소는 전위순회에서는 맨 처음 방문하는 원소이다.

따라서 이 성질을 이용하도록 하자.

후위순회의 맨 마지막 원소가 중위순회에서 몇번째 인덱스인지 찾고
중위순회 배열에서
1. 첫번째 인덱스  ~  찾은 인덱스,
2. 찾은인덱스  ~ 마지막 인덱스
로 분할 한다. 그 이유는 중위는 말 그대로 중간에 거친 원소이니, 좌 우로 나눌수 있기 때문이다.

중위순회 배열을 나눴다면 후위순회 배열도 나누어야 한다.

후위순회도
1. 후위 배열의 첫번째 인덱스 ~ 찾은인덱스 - 중위순회에서의 첫 인덱스 - 1
2. 후위 배열의 첫번째 인덱스 ~ 마지막 인덱스 -1 을 해줘야 한다.

소스코드 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> in;
vector<int> post;
vector<int> Slice(const vector<int>& v, int a, int b) {
    return vector<int>(v.begin() + a, v.begin() + b);
}
int cnt = 0;
void Recursive(int s1, int e1, int s2, int e2) {
    if (s1 > e1 || e2 < s2) {
        return;
    }
    cout << post[e2] << ' ';
    int find = post[e2];
    for (int i = s1; i <= e1; i++) {
        if (find == in[i]) {
            find = i;
            break;
        }
    }
    
    Recursive(s1, find - 1, s2, s2 + find - s1-1);
    Recursive(find + 1, e1, s2+(find - s1) , e2- 1);
}
int main() {
    int n;
    cin >> n;
    in.resize(n , 0);
    post.resize(n , 0);
    cin.clear();
    cin.ignore();
    for (int i = 0; i < n; i++) {
        cin >> in[i];
    }
    cin.ignore();
    for (int i = 0; i < n; i++) {
        cin >> post[i];
    }
    Recursive(0, post.size() - 10, post.size()-1);
    return 0;
}
cs

댓글