← Back to List

4256번: 트리 ↗

Solutions

C++14
1.2 KB | 1204 chars
#include <iostream>
using namespace std;
int tc,n;
int ar[1100];
int ar2[1100];
int d[1100];
int d2[1100];

void f(int mid, int left, int right) {
    // cout << mid << " " << left << " " << right << "*\n";
    if(left > right) {
        return;
    }
    if(left == right) {
        cout << ar[mid] << " ";
        return;
    }


    int currnet_mid2 = d2[ar[mid]];
    // cout << "current mid2 = " << currnet_mid2 << "\n";
    int k = n;

    for(int x=left; x<currnet_mid2; x++) {
        if(d[ar2[x]] < k) {
            k = d[ar2[x]];
        }
    }
    if(k != n) f(k,left,currnet_mid2-1);

    k = n;
    for(int x = currnet_mid2+1; x<=right; x++) {
        if(d[ar2[x]] < k) {
            k = d[ar2[x]];
        }
    }
    if(k != n) f(k,currnet_mid2+1,right);

    cout << ar[mid] << " ";
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> tc;
    while(tc--) {
        cin >> n;
        for(int x=0; x<n; x++) {
            cin >> ar[x];
            d[ar[x]] = x;        
        }
        for(int x=0; x<n; x++) {
            cin >> ar2[x];
            d2[ar2[x]] = x;
        }

        f(0,0,n-1); // 전위순회 현재, 중위탐색 왼쪽 오른쪽
        cout << "\n";
    }
}