카테고리 없음

[백준][C++] 9934 완전 이진 트리

김 정 환 2021. 3. 4. 12:11
반응형

www.acmicpc.net/problem/9934

 

9934번: 완전 이진 트리

상근이는 슬로베니아의 도시 Donji Andrijevci를 여행하고 있다. 이 도시의 도로는 깊이가 K인 완전 이진 트리를 이루고 있다. 깊이가 K인 완전 이진 트리는 총 2K-1개의 노드로 이루어져 있다. (아래

www.acmicpc.net

 

 

 

알고리즘 종류

    - 트리

    - 그래프

 

 

 

사고 과정

    - 중위 순회는 root를 중간에 출력하게 된다. 그리고 문제에서 제시된 트리는 완전 이진 트리이다. 따라서 중위 순회의 가운데 있는 값은 root가 된다.

        1. 순회 배열에서 mid로 root를 찾는다.

        2. root를 기준으로 좌우 트리를 나누고 다시 mid로 root를 찾는다.

 

 

 

구현(C++)

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
#include <vector>
#include <iostream>
#include <math.h>
 
using namespace std;
 
 
int k;
vector<int> bag;
vector<int> answer[11];
 
void search(int s, int e, int depth){
    
    if(s == e) {
        answer[depth].push_back(bag[s]);
        return;
    }
    
    // 완전 이진 트리이고 중위 순회이므로, 가운데 있는 값은 root가 된다.
    int mid = (e+s)/2;
    answer[depth].push_back(bag[mid]);
    
    // root를 제외하고 좌우로 나누어서 탐색을 진행한다.
    search(s, mid-1, depth+1);
    search(mid+1, e, depth+1);
}
 
 
int main(){
    cin >> k;
    
    for(int i=0; i<pow(2,k)-1; i++){
        int num;
        cin >> num;
        bag.push_back(num);
    }
 
    search(0, bag.size()-10);
    
    for(int i=0; i<k; i++){
        for(int j=0; j<answer[i].size(); j++){
            cout << answer[i][j] << " ";
        }
        cout << endl;
    }
}
cs

 

 

 

시행착오

반응형