일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Loss Function
- 양방향 매핑
- google login
- @Transactional
- 순환참조
- C++
- idToken
- google 로그인
- yolo
- Spring
- google cloud
- marksense.ai
- skt fellowship 3기
- html
- react native
- matplotlib
- Expo
- STT
- YOLOv5
- Spring Boot
- pandas
- 커스텀 데이터 학습
- 코드업
- 2021 제9회 문화공공데이터 활용경진대회
- 졸프
- oauth
- AWS
- JPA
- OG tag
- javascript
- Today
- Total
민팽로그
[백준/BOJ] 5639: 이진 검색 트리 본문
https://www.acmicpc.net/problem/5639
5639번: 이진 검색 트리
트리를 전위 순회한 결과가 주어진다. 노드에 들어있는 키의 값은 106보다 작은 양의 정수이다. 모든 값은 한 줄에 하나씩 주어지며, 노드의 수는 10,000개 이하이다. 같은 키를 가지는 노드는 없다
www.acmicpc.net
문제
이진 검색 트리는 다음과 같은 세 가지 조건을 만족하는 이진 트리이다.
- 노드의 왼쪽 서브트리에 있는 모든 노드의 키는 노드의 키보다 작다.
- 노드의 오른쪽 서브트리에 있는 모든 노드의 키는 노드의 키보다 크다.
- 왼쪽, 오른쪽 서브트리도 이진 검색 트리이다.

전위 순회 (루트-왼쪽-오른쪽)은 루트를 방문하고, 왼쪽 서브트리, 오른쪽 서브 트리를 순서대로 방문하면서 노드의 키를 출력한다. 후위 순회 (왼쪽-오른쪽-루트)는 왼쪽 서브트리, 오른쪽 서브트리, 루트 노드 순서대로 키를 출력한다. 예를 들어, 위의 이진 검색 트리의 전위 순회 결과는 50 30 24 5 28 45 98 52 60 이고, 후위 순회 결과는 5 28 24 45 30 60 52 98 50 이다.
이진 검색 트리를 전위 순회한 결과가 주어졌을 때, 이 트리를 후위 순회한 결과를 구하는 프로그램을 작성하시오.
입력
트리를 전위 순회한 결과가 주어진다. 노드에 들어있는 키의 값은 106보다 작은 양의 정수이다. 모든 값은 한 줄에 하나씩 주어지며, 노드의 수는 10,000개 이하이다. 같은 키를 가지는 노드는 없다.
출력
입력으로 주어진 이진 검색 트리를 후위 순회한 결과를 한 줄에 하나씩 출력한다.
예제 입력
50
30
24
5
28
45
98
52
60
예제 출력
5
28
24
45
30
60
52
98
50
코드
1) struct 사용
#include <iostream>
using namespace std;
typedef struct Node{
int data;
Node* left;
Node* right;
Node(int v): data(v), left(NULL), right(NULL) {}
} Node;
Node* insert(Node* node, int v) {
if (node == NULL) {
node = new Node(v);
}
else if (node->data >= v) {
node->left = insert(node->left, v);
}
else {
node->right = insert(node->right, v);
}
return node;
}
void post(Node* node) {
if (node == NULL) return;
post(node->left);
post(node->right);
cout << node->data << '\n';
}
int main() {
int n;
Node* root = NULL;
while (cin >> n) {
if (n == EOF) break;
root = insert(root, n);
}
post(root);
return 0;
}
2) 배열 사용
#include <iostream>
using namespace std;
int tree[10000];
void post(int start, int end) {
if (start > end) return;
if (start == end) {
cout << tree[start] << '\n';
return;
}
int idx = start;
while (++idx <= end) {
if (tree[start] < tree[idx]) break;
}
post(start + 1, idx - 1);
post(idx, end);
cout << tree[start] << '\n';
}
int main() {
int n, idx = 0;
while (cin >> n) {
if (n == EOF) break;
tree[idx++] = n;
}
post(0, idx - 1);
return 0;
}
일단 내가 처음 생각한 방식은 배열을 사용하는 방식이다. 전위 순회는 루트-왼쪽-오른쪽 순으로 방문하고 후위 순회는 왼쪽-오른쪽-루트 순으로 방문한다. 따라서 전위 순회가 먼저 출력한 루트를 가장 나중에 출력해 주는 방법을 생각했다. dfs를 통해 루트는 출력하지 않고 왼쪽 서브트리와 오른쪽 서브트리를 찾는다(트리의 범위를 인자로 넘겨주기 위해 start와 end를 매개변수로 두었다). 루트보다 큰 수가 나오는 곳의 인덱스를 찾아야 한다. 루트보다 작은수들로만 이루어진 구간이 왼쪽 서브트리, 루트보다 큰 수들로만 이루어진 구간이 오른쪽 서브트리이기 때문이다. 이후 왼쪽 서브트리, 오른쪽 서브트리 순으로 재귀호출하고 마지막으로 루트를 출력해준다. start가 end보다 크면 아무 작업 없이 return, start와 end가 같다면 리프 노드인 것이므로 해당 노드를 출력 후 리턴한다.
'PS > 백준📖' 카테고리의 다른 글
[백준 / BOJ] 11066: 파일 합치기 (0) | 2022.02.27 |
---|---|
[백준/BOJ] 4803번: 트리 (0) | 2022.02.23 |
[백준/BOJ] 1967: 트리의 지름 (0) | 2022.02.20 |
[백준/BOJ] 1167: 트리의 지름 구하기 (0) | 2022.02.12 |
[백준/BOJ] 1707: 이분 그래프 (0) | 2022.02.10 |