백준 알고리즘
백준 5639(이진 검색 트리)
rycbar2592
2020. 11. 16. 19:13
5639번: 이진 검색 트리
트리를 전위 순회한 결과가 주어진다. 노드에 들어있는 키의 값은 106보다 작은 양의 정수이다. 모든 값은 한 줄에 하나씩 주어지며, 노드의 수는 10,000개 이하이다. 같은 키를 가지는 노드는 없다
www.acmicpc.net
처음 풀이
/*
재귀를 이용해서 leftNode에는 subtree의 왼쪽 node들을 저장
rightNode에는 subtree의 오른쪽 노드들을 저장
인자로 vector를 전달하기 때문에 메모리 초과 발생
*/
void recursive(vector<int> vec) {
if(vec.size() == 0) return ;
int root = vec[0];
vector<int> leftNode, rightNode;
for(int idx = 1; idx < vec.size(); idx++) {
if(vec[idx] < root) leftNode.push_back(vec[idx]);
else rightNode.push_back(vec[idx]);
}
recursive(leftNode);
recursive(rightNode);
cout << root << endl;
}
정답 코드
vector를 넘기는 대신 왼쪽과 오른쪽 인덱스를 넘겨 구한다.
#include <iostream>
#include <vector>
using namespace std;
vector<int> vec;
void input() {
int N;
while(cin >> N) vec.push_back(N);
}
void recursive(int left, int right) {
int root = vec[left];
int idx = left + 1;
for( ; idx <= right; idx++)
if(vec[idx] >= root) break;
if(left < idx - 1) recursive(left + 1, idx - 1);
if(idx <= right) recursive(idx, right);
cout << root << endl;
}
int main(void) {
input();
recursive(0, vec.size() - 1);
return 0;
}
배열의 양 끝을 left와 right로 잡은 후 root보다 값이 큰 인덱스를 idx변수로 잡아준다.
left + 1에서부터 idx - 1까지가 root의 왼쪽 subtree가 된다.
idx에서부터 right는 root의 오른쪽 subtree가 된다.
위와 같이 진행이 된다.