www.acmicpc.net/problem/5639

 

5639번: 이진 검색 트리

문제 이진 검색 트리는 다음과 같은 세 가지 조건을 만족하는 이진 트리이다. 노드의 왼쪽 서브트리에 있는 모든 노드의 키는 노드의 키보다 작다. 노드의 오른쪽 서브트리에 있는 모든 노드의 �

www.acmicpc.net


  • 노드 값들을 주고 후위 순회대로 출력하는 것이 아닌, 전위 순회 출력을 입력으로 주기 때문에, 노드를 만드는 것이 까다롭다.
  • 이진 트리의 속성 중 왼쪽 서브트리들은 모두 작은 값, 오른쪽 서브트리들은 모두 큰 값이라는 조건이 있다.
  • 위 조건을 활용하여 해당 노드에서의 왼쪽, 오른쪽 구역을 나눌 수 있다.
  • 각자 구역은 또다시 특정 노드의 이진트리가 되는데, 이 때 특정 노드값을 알아내면 재귀호출이 가능하다.
  • 전위 순회를 입력으로 주었기 때문에, 특정 노드의 양쪽 서브트리를 구할 때, 바로 다음 입력값이 왼쪽 노드, 처음으로 나오는 큰 값이 오른쪽 노드가 된다.
  • 처음에 입력값을 받으면서 입력 종료 시점에 대해서 처리해줄 때 주의해야 한다.

#include <iostream>
#include <vector>

using namespace std;

vector<int> data;

void post(int begin, int end)               // begin 은 노드 시작점, end 는 마지막 점 (포함하지 않음)
{
    if(begin >= end)                        // 인덱스 초과 시 그냥 종료
    {
        return;
    }
    if(begin == end - 1)                    // 마지막 노드일 시 출력 후 종료
    {
        cout << data[begin] << '\n';
        return;
    }
    int idx;
    for(idx = begin ; idx < end ; idx++)    // 피봇 idx 를 설정 
    {                                       // 양쪽 서브트리를 나눠주는 값으로 지정 (처음으로 나오는 오른쪽 노드값)
        if(data[idx] > data[begin]) break;
    }
    post(begin + 1, idx);                   // 왼쪽 서브트리 재귀 호출
    post(idx, end);                         // 오른쪽 서브트리 재귀 호출
    cout << data[begin] << '\n';            // 노드값 출력
}

int main(void)
{
    int temp;
    do
    {
        cin >> temp;
        data.push_back(temp);
    } while(getc(stdin) == '\n');                           // 개행이 입력될때마다 값 하나씩 입력해서 data 에 집어넣음
    
    if(data[data.size() - 1] == data[data.size() - 2])      // 입력값이 종료될 때 개행문자가 들어간 뒤 종료되면, getc(stdin) 에서 참으로 확인하여 temp 를 한 번 더 넣게 된다.
    {
        data.pop_back();                                    // 만약 뒤의 두개 값이 같은 값이라면 하나를 지워주는 작업
    }

    post(0, data.size());
}

'PS > BOJ' 카테고리의 다른 글

[백준] 16953.cpp : A -> B  (0) 2020.08.10
[백준] 11660.cpp : 구간 합 구하기 5  (0) 2020.08.07
[백준] 15666.cpp : N과 M (12)  (0) 2020.08.05
[백준] 1991.cpp : 트리 순회  (0) 2020.08.04
[백준] 1932.cpp : 정수 삼각형  (0) 2020.08.03

+ Recent posts