Problem Solving/BOJ

[백준 4256번] [트리] 트리

  • -
728x90
반응형

Approach

자료구조 수업에서나 나올법한 문제이다. 잘 생각해보면 preorder가 하는 역할을 잘 생각해보면, 루트 노트부터 시작해서 왼쪽 방향무터 서브트리의 루트노드를 지속적으로 방문하게 된다. 따라서 해당 순서를 inorder에서 바라보게 되면, 발견한 index를 기준으로 왼쪽은 자신을 기준으로 왼쪽과 오른쪽으로 subtree를 나누어서 생각할 수 있다. 세그트리 짜는 것처럼, start, end index를 함수의 입력값으로 두고 계속해서 좁혀가면 쉽게 구할 수 있다.

Code

#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(0). cin.tie(0), cout.tie(0)

using namespace std;

vector<int> preorder;
vector<int> inorder;
int index_val;

void find(int left, int right){
    
    int cur = preorder[index_val++];
    int index;

    if (left == right)
    {
        cout << cur << " ";
        return;
    }
    else if(left > right){
        index_val--;
        return;
    }

    for(int i = left; i <= right; i++){
        if(inorder[i] == cur){
            index = i;
            break;
        }
    }

    find(left, index - 1);
    find(index + 1, right);
    cout << cur << " ";
    return;
}

int main(void){
    int t;
    cin >> t;
    while(t--){
        index_val = 0;
        int n;
        cin >> n;
        preorder = vector<int>(n);
        inorder = vector<int>(n);

        for(int i = 0 ; i < n; i++){
            cin >> preorder[i];
        }

        for(int i = 0; i < n; i++){
            cin >> inorder[i];
        }

        find(0, n - 1);
        cout << "\n";
    }
    return 0;
}
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.