#include <iostream>
using namespace std;
int inorder[100001];
int postorder[100001];
int idx[100001];
void preorder(int inbegin, int inend, int postbegin, int postend)
{
if (inbegin > inend)
return;
if (postbegin > postend)
return;
int root = postorder[postend];
cout << root << " ";
// 왼쪽
preorder(inbegin, idx[root] - 1, postbegin, postbegin + idx[root] - inbegin - 1);
// 오른쪽
preorder(idx[root] + 1, inend, postbegin + idx[root] - inbegin, postend - 1);
}
int main(void)
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> inorder[i];
idx[inorder[i]] = i;
}
for (int i = 0; i < n; i++)
{
cin >> postorder[i];
}
preorder(0, n - 1, 0, n - 1);
return 0;
}
트리 pre, post, inorder 방식의 흐름을 직접 그려가며 코드를 작성한다.
preorder 방식은 루트 -> 왼 -> 오 를 탐구하는 방식이다.
inoder 방식은 왼 -> 루트 -> 오 를 탐구하는 방식이다.
postorder 방식은 왼 -> 오 -> 루트를 탐구하는 방식이다.
postorder 방식에서 맨 마지막원소는 루트를 의미한다.
너무 어려워서 자료를 참고했다. 나는 재귀가 너무 약한거같다...,,,,,