백준 5639 이진 검색 트리

2020. 4. 17. 13:38Algorithm/문제풀이

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

 

5639번: 이진 검색 트리

문제 이진 검색 트리는 다음과 같은 세 가지 조건을 만족하는 이진 트리이다. 노드의 왼쪽 서브트리에 있는 모든 노드의 키는 노드의 키보다 작다. 노드의 오른쪽 서브트리에 있는 모든 노드의 키는 노드의 키보다 크다. 왼쪽, 오른쪽 서브트리도 이진 검색 트리이다. 전위 순회 (루트-왼쪽-오른쪽)은 루트를 방문하고, 왼쪽 서브트리, 오른쪽 서브 트리를 순서대로 방문하면서 노드의 키를 출력한다. 후위 순회 (왼쪽-오른쪽-루트)는 왼쪽 서브트리, 오른쪽 서브트리,

www.acmicpc.net

이진 검색트리의 순회를 활용하여 문제를 풀어보겠습니다. 

 

이 문제의 입력은 이진 검색 트리를 전위순회한 값으로 주어지고 있습니다. 전위 순회는 root, 왼쪽 노드, 오른쪽 노드 순으로 진행이 됩니다. 이진 검색트리의 왼쪽 노드는 작은 값들만 존재하기 때문에 이점을 잘 이용해야 합니다. 

 

그래서 root 보다 큰 값의 인덱스를 찾은 다음 left, right 부분을 나누어서 분할 정복을 해주면 쉽게 해결할 수 있습니다. 여기서 해당 index를 찾기 위해서 이진탐색을 이용한 upper_bound를 사용했습니다. 

 

더보기
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

int size;
int arr[100002];
void input();
void getPostorder(int start, int end);

int main(){
	input();
	getPostorder(0, size);
}

void input(){
	int num;
	while(scanf("%d", &num) != -1){
		arr[size++] = num; 
	}
}


void getPostorder(int start, int end){
	if(start >= end)return;
	int upperIndex = distance(arr, upper_bound(arr+start+1, arr + end, arr[start]));

	getPostorder(start+1, upperIndex);	
	getPostorder(upperIndex, end);
	printf("%d\n", arr[start]);
}

 

위 문제에서 또 문제의 의도와 다르게 직접 이진검색트리를 구현하여 문제를 해결할 수도 있습니다. 트리를 구성한 후 후위 순회를 돌려서 결과를 출력하면 됩니다. 

'Algorithm > 문제풀이' 카테고리의 다른 글

백준 1786 - 찾기  (0) 2020.07.18
백준 2580 스도쿠  (0) 2020.05.06
백준 2263 트리의 순회  (0) 2020.04.17
백준 1167 트리의 지름  (0) 2020.04.17
백준 11725 트리의 부모 찾기  (0) 2020.04.17