ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 - 이진 검색 트리 (5639) [C++]
    문제 풀이/백준 2024. 1. 26. 19:33
    반응형

    이 문제는 이진 검색 트리를 이용한 문제이다.

     

    이진 검색 트리의 전위 순회의 경우, 루-왼-오 순으로 노드를 탐색하고, 후위 순회의 경우 왼-오-루 순으로 탐색한다.

    따라서 주어진 범위 내에서의 벡터에서 가장 첫번째 노드는 항상 루트이고, 그 안에서 루트보다 작은 첫번째 값이 왼쪽 서브트리의 루트, 루트보다 큰 첫번째 값이 오른쪽 서브트리의 루트가 된다. 이를 이용해서 풀면 된다.

     

    주의할 점은 이진 검색 트리가 최악의 경우 1자로 쭉 이어질 수 있는데, 이를 까먹고 전역 배열을 만들어 원래 트리를 형성하려고 하면 안된다. OutOfBounds 런타임 에러를 만나게 된다.

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    #define MAX 10000
    #define INF 100000000
    
    vector<int> preorder;
    
    void input() 
    {
    	while (true)
    	{
    		int temp;
    		
    		cin >> temp;
    		if (cin.eof())
    		{
    			break;
    		}
    		preorder.push_back(temp);
    	}
    }
    
    int findLeftIndex(const int start, const int end, const int root)
    {
    	for (int i = start + 1; i < end; i++)
    	{
    		if (preorder[i] < root)
    		{
    			return i;
    		}
    	}
    
    	return end;
    }
    
    int findRightIndex(const int start, const int end, const int root)
    {
    	for (int i = start + 1; i < end; i++)
    	{
    		if (preorder[i] > root)
    		{
    			return i;
    		}
    	}
    
    	return end;
    }
    
    void toOridinal(const int index, const int start, const int end)
    {	
    	const int root = preorder[start];
    	const int leftIndex = findLeftIndex(start, end, root);
    	const int rightIndex = findRightIndex(start, end, root);
    
    	if (leftIndex < end)
    	{
    		toOridinal(index * 2, leftIndex, rightIndex);
    	}
    	
    	if (rightIndex < end)
    	{
    		toOridinal(index * 2 + 1, rightIndex, end);
    	}
    
    	cout << root << '\n';
    }
    
    int main() 
    {
    	ios_base::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    
    	input();
    
    	toOridinal(1, 0, preorder.size());
    
    	return 0;
    }
    반응형

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

    백준 - N-Queen (9663) [C++]  (0) 2024.03.04
    백준 - 이중 우선순위 큐 (7662) [C++]  (0) 2024.03.02
    백준 - 트리의 지름 (1167) [C++]  (0) 2024.01.22
    백준 - 거짓말 (1043) [C++]  (0) 2024.01.22
    백준 - 부분합 (1806) [C++]  (1) 2024.01.22
Designed by Tistory.