www.acmicpc.net/problem/9934

 

9934번: 완전 이진 트리

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

www.acmicpc.net


  • 완전 이진 트리이기 때문에, 배열 하나로 노드들을 표시할 수 있다.
  • 1을 루트 노드로 잡으면, 모든 노드들에 대해서 왼쪽 자식은 2*n , 오른쪽 자식은 2*n + 1 이 된다.
  • 루트 노드부터 전위 순회 방식으로 재귀함수를 호출하면서, 입력 순서에 따라 노드 순서를 맞춰준다.
  • 층별로 2^n 의 갯수에 맞게 출력해준다.

#include <iostream>

using namespace std;

int k, number;
int order[1024];        // 입력값 순서 배열
int answer[1024];       // 1을 루트노드로 한 노드 순서 배열
int count = 0;

void Seek(int idx, int depth)
{
    if(depth == k)                      // 마지막 층이라면
    {
        answer[idx] = order[count++];   // 해당 노드만 값 넣어주고 끝
    }
    else
    {                                   // 마지막 층이 아니라면
        Seek(idx * 2, depth + 1);       // 왼쪽 자식노드 검사
        answer[idx] = order[count++];   // 현재 노드값 검사, count 증가값에 따라 순서대로 들어가기 때문에 순서가 중요
        Seek(idx * 2 + 1, depth + 1);   // 오른쪽 자식노드 검사
    }
}

int main()
{
    cin >> k;
    number = (1 << k) - 1;
    for(int i = 0 ; i < number ; i++) cin >> order[i];

    Seek(1, 1);

    for(int n = 0, idx = 1 ; n < k ; n++)   // 층별로 출력하기
    {
        for(int i = 0 ; i < 1 << n ; i++)
        {
            cout << answer[idx++] << ' ';
        }
        cout << '\n';
    }
}

  • 8등 소스코드 참고 : www.acmicpc.net/source/6485380
  • 홀수 인덱스인 값들이 맨 마지막 줄이 된다.
  • 짝수 인덱스인 값들을 하나의 줄로 생각하고, 그 줄에서 다시 홀수 인덱스들이 다음 줄이 된다.
  • 위의 과정을 루트에 도달할때까지 반복한다.

#include <stdio.h>

int main()
{
    int k;
    int pow[11];
    int ans[12][1101];
    int c[12][1101];

    pow[0] = 1;
    for(int i = 1 ; i <= 10 ; i++)
    {
        pow[i] = pow[i-1] * 2;
    }

    scanf("%d", &k);
    for(int i = 1 ; i <= pow[k] - 1 ; i++)
    {
        scanf("%d", &c[k+1][i]);
    }

    for(int i = k ; i >= 1 ; i++)
    {
        for(int j = 1 ; j <= pow[i]-1 ; j++)
        {
            if(j % 2) ans[i][(j+1)/2] = c[i+1][j];
            else c[i][j/2] = c[i+1][j];
        }
    }

    for(int i = 1 ; i <= k ; i++)
    {
		for(int j = 1 ; j <= pow[i-1] ; j++)
        {
			printf("%d ", ans[i][j]);
		}
		printf("\n");
	}
}

'PS > BOJ' 카테고리의 다른 글

[백준] 10799 : 쇠막대기  (0) 2020.09.23
[백준] 1946 : 신입 사원  (0) 2020.09.17
[백준] 2468 : 안전 영역  (0) 2020.09.15
[백준] 4963 : 섬의 개수  (0) 2020.09.14
[백준] 19844 : 단어 개수 세기  (0) 2020.09.13

+ Recent posts