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가 된다.
위와 같이 진행이 된다.
'백준 알고리즘' 카테고리의 다른 글
가장 긴 증가하는 부분 수열4, 5 (0) | 2020.11.11 |
---|---|
가장 긴 증가하는 부분 수열 (0) | 2020.11.11 |
백준 11000 (강의실 배정) (0) | 2020.06.29 |
백준 1327(소트 게임) (0) | 2020.06.04 |
백준 1484 (다이어트) (0) | 2020.05.29 |