티스토리 뷰

전위 순회는 루트가 맨 앞에, 후위 순회는 루트가 맨 뒤에 있다는 점을 이용해 풀었다.


예제 입력을 보자


50 - 루트

30

24

5

28

45 - 여기까지 루트의 왼쪽 서브트리

98 - 루트 보다 큰 첫번째 값

52

60


50 의 왼쪽 서브트리 : 30 24 5 28 45

50 의 오른쪽 서브트리 : 98 52 60


여기서 다시 왼쪽 오른쪽 나누면


30의 왼쪽 서브트리 : 24 5 28

30의 오른쪽 서브트리 : 45


......


이런 식으로 루트보다 큰 값 전까지를 왼쪽 서브트리, 큰 값 부터는 오른쪽 서브트리로 나눠서


더 이상 방문할 자식 노드가 없을 때 출력해주면 된다.




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
#include <iostream>
#define FOR(i,a,b) for(int i = a; i < b; i++)
#define mp(a,b) make_pair(a,b)
using namespace std;
int v[10002];
int k = 0// 트리 사이즈
void postOrder(int a, int b) {
    //현재 루트보다 큰 값을 찾고, 큰 값의 인덱스 전까지 배열을 다시 재귀호출
    if (b == a) return;
    int root = v[a], idx = b;
    FOR(i, a, b) {
        if (v[i] > root) {
            idx = i; // 루트보다 큰 값의 인덱스
            break;
        }
    }
    if (b - a > 1) { // 원소가 두 개 이상일 때
        postOrder(a + 1, idx); // 왼쪽 서브트리
        postOrder(idx, b); // 오른쪽 서브트리
    }
    printf("%d\n", root);
}
int main() {
    while (scanf("%d"&v[k++]) != EOF);
    postOrder(0, k - 1);
}
cs


반응형

'백준 온라인 저지' 카테고리의 다른 글

190211 BOJ 1722번 순열의 순서  (0) 2019.02.11
190209 BOJ 1761번 정점들의 거리  (0) 2019.02.09
190207 BOJ 1753번 최단경로  (0) 2019.02.07
190203 BOJ 2517번 달리기  (0) 2019.02.03
190202 BOJ 6416번 트리인가?  (0) 2019.02.02
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함