2263

#트리 #분할_정복 #재귀
https://www.acmicpc.net/problem/2263

풀이


#include <iostream>
#include <algorithm>

using namespace std;

int InorderIndices[100'001];
int Inorder[100'000];
int Postorder[100'000];

void PrintToPreorder(int InStart, int InEnd, int PostStart, int PostEnd)
{
    int PostIndex = PostEnd - 1;

    cout << Postorder[PostIndex] << ' ';
    
    int InIndex = InorderIndices[Postorder[PostIndex]];

    if(InIndex >= InEnd)
    {
        return;
    }

    int LeftNum = InIndex - InStart;
    int RightNum = InEnd - (InIndex + 1);
    // Left
    if(LeftNum > 0)
    {
        PrintToPreorder(InStart, InIndex, PostStart, PostEnd - 1 - RightNum);
    }

    // Right
    if(RightNum > 0)
    {
        PrintToPreorder(InIndex + 1, InEnd, PostEnd - RightNum, PostIndex);
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N;
    cin >> N;
    for(int i = 0; i < N; ++i)
    {
        cin >> Inorder[i];
        InorderIndices[Inorder[i]] = i;
    }
    for(int i = 0; i < N; ++i)
    {
        cin >> Postorder[i];
    }

    PrintToPreorder(0, N, 0, N);

    return 0;
}