Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- BOJ #컴퓨터공학 #C++ #알고리즘 #자료구조
- 컴퓨터공학 #c #c언어 #문자열입력
- HTML #CSS
- 잔
- 컴퓨터공학 #자료구조 #스택 #c++ #알고리즘 #백준문제풀이
- 컴퓨터공학 #Java #자바 #클래스 #객체 #인스턴스
Archives
- Today
- Total
영벨롭 개발 일지
[백준 BOJ][C++]9934번 완전 이진 트리 풀이: 트리 본문
https://www.acmicpc.net/problem/9934
입력 k는 완전 이진 트리의 깊이를 나타내고, 배열은 트리 내 노드를 중위 순회(inorder)한 순서입니다.
먼저 트리 내 노드의 개수를 알아야겠죠? 완전 이진 트리의 깊이 k가 알려졌을 때 총 노드의 수는 다음과 같습니다.
중위 순회는 왼쪽 자식 노드 -> 부모 노드 -> 오른쪽 자식 노드 순으로 탐색하는 방법입니다.
이제 문제를 해결하기 위한 사전 지식은 갖춰졌으니 문제를 풀어보겠습니다.
먼저 depth 1에는 루트 노드 하나만 있겠죠? 루트 노드는 완전 이진 트리를 중위 순회한 배열에서도 가운데에 위치해있습니다.
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
원소 | 1 | 6 | 4 | 3 | 5 | 2 | 7 |
루트노드를 찾았다면 해당 원소를 트리 배열에 저장합니다.
이제 왼쪽 서브 트리로 이동하겠습니다.
왼쪽 서브 트리 index 0부터 2까지의 중간 원소인 6이 왼쪽 서브 트리의 부모 노드가 됩니다.
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
원소 | 1 | 6 | 4 | 3 | 5 | 2 | 7 |
오른쪽 서브 트리도 마찬가지 입니다.
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
원소 | 1 | 6 | 4 | 3 | 5 | 2 | 7 |
#include<iostream>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
int k;
int num;
int arr[1050];
vector<int> tree[10];
void solution(int s, int e, int d) {
if (d >= k)
return;
if (s == e) { //리프 노드
tree[d].push_back(arr[s]);
return;
}
int m = (s + e) / 2;
if (m < 0 || m >= num)
return;
tree[d].push_back(arr[m]); //중간 값 트리 내 depth d에 push
solution(s, m - 1, d + 1); //왼쪽 서브 트리
solution(m + 1, e, d + 1); //오른쪽 서브 트리
}
int main(void) {
cin >> k;
num = pow(2, k) - 1;
for (int i = 0; i < num; i++) {
cin >> arr[i];
}
solution(0, num - 1, 0);
for (int i = 0; i < k; i++) {
for (int j = 0; j < tree[i].size(); j++) {
cout << tree[i][j] << " ";
}
cout << endl;
}
return 0;
}
반응형
'알고리즘 문제 풀이 > BOJ' 카테고리의 다른 글
[백준 BOJ][C++]13398번 연속합 2 풀이: DP (0) | 2022.03.16 |
---|---|
[백준 BOJ][C++]9465번 스티커 풀이: DP (0) | 2022.03.15 |
[백준 BOJ][C++]11057번 오르막 수 풀이: DP (0) | 2022.03.10 |
[백준 BOJ][C++]1149번 RGB 거리 풀이: DP (0) | 2022.03.10 |
[백준 BOJ][C++]3187번 양치기 꿍 풀이: BFS/DFS (0) | 2022.03.09 |