티스토리 뷰

알고리즘/백준

백준 9934 완전 이진 트리

4567은 소수 2022. 8. 28. 01:13

https://www.acmicpc.net/problem/9934

 

9934번: 완전 이진 트리

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

www.acmicpc.net

주어진 입력으로 중위 순회가 되도록 만드는 문제입니다.

 

중위 순회 : 트리를 왼쪽 자식 -> 부모 -> 오른 자식 순으로 탐색

 

모든 depth에 자식을 2개씩 갖는 포화 이진 트리이므로 (문제 제목은 완전 이진 트리이지만 문제에 2^k-1 개 노드 갖는다고 함) 인터벌의 가운데가 부모가 되며 depth를 1씩 올리며 재귀를 돌면 됩니다.

 

코드는 다음과 같습니다. 

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cmath>

using namespace std;

int k;
vector<int> nums;
vector<int> tree[10];
bool check[1025];
int total;

void init()
{
    cin >> k;
    int num;
    
    total = (int)pow(2, k) - 1;
    for(int i = 0; i < total; i++) {
        cin >> num;
        nums.push_back(num);
    }
    memset(check, false, sizeof(check));
}

void travel(int depth, int start, int last)
{
    
    // 중위 순회 되도록 만들기 (왼 부모 오 순 되도록 만듬)
    int mid = (start + last) / 2;
    int num = nums[mid];
    if(check[num])
        return;
    
    tree[depth].push_back(num);
    check[num] = true;
    
    travel(depth + 1, start, mid);
    travel(depth + 1, mid + 1, last);
}


int main()
{
    ios_base :: sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    init();
    
    travel(0, 0, total);
    for(int i = 0; i < k; i++) {
        for(int j = 0; j < tree[i].size(); j++) {
            cout << tree[i][j] << ' ';
        }
        cout << '\n';
    }
}

'알고리즘 > 백준' 카테고리의 다른 글

백준 3372 보드 점프  (0) 2022.08.28
백준 1039 교환  (0) 2022.08.28
백준 10165 버스 노선  (0) 2022.08.16
백준 5582 공통 부분 문자열 C++  (0) 2022.08.12
백준 6487 두 직선의 교차 여부 C++  (0) 2022.08.09
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/12   »
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
글 보관함