순간을 성실히, 화려함보단 꾸준함을

[ boj : 2263 ] 트리의 순회 본문

알고리즘,SQL/백준,BOJ

[ boj : 2263 ] 트리의 순회

폭발토끼 2021. 7. 4. 10:46

https://www.acmicpc.net/problem/2263

 

2263번: 트리의 순회

첫째 줄에 n(1≤n≤100,000)이 주어진다. 다음 줄에는 인오더를 나타내는 n개의 자연수가 주어지고, 그 다음 줄에는 같은 식으로 포스트오더가 주어진다.

www.acmicpc.net

문제 : inorder와 postorder가 주어질때 preorder를 출력해라

해설 : 크게 왼쪽 트리와 오른쪽 트리로 나누어야 되는데 매번 나눌때마다 postorder에 가장 오른쪽 값이 서브트리의 부모노드가 됩니다. 이 말은 즉슨 매번 postorder의 가장 오른쪽 값을 출력하면 그게 바로 preorder 순서대로 출력한 값이 됩니다.

inorder를 탐색할 l과r을 선언해주고, postorder를 탐색할 l과 r을 따로 선언해줍니다.

이후에 왼쪽트리부터 탐색하고 그 후 오른쪽 트리로 탐색해 줍시다.

#include<bits/stdc++.h>

using namespace std;

int in[100010], post[100010],arr[100010];
void f(int il, int ir, int pl, int pr);

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

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

	f(0, n - 1, 0, n - 1);
}
void f(int il, int ir, int pl, int pr)
{
	if (il > ir || pl > pr)return;

	int ans = post[pr];
	cout << ans << " ";

	f(il, arr[ans] - 1, pl, pr - (ir - arr[ans] + 1));
	f(arr[ans] + 1, ir, pl + (arr[ans] - il), pr - 1);
}

'알고리즘,SQL > 백준,BOJ' 카테고리의 다른 글

[ boj : 6416 ] 트리인가?  (0) 2021.07.10
[ boj : 18126 ] 너구리 구구  (0) 2021.07.06
[ boj : 5052 ] 전화번호 목록  (0) 2021.07.03
[ boj : 1451 ] 직사각형으로 나누기  (0) 2021.06.26
[ boj : 2421 ] 저금통  (0) 2021.06.19