블로그

[C++] 백준 2263 : 트리의 순회 본문

PS

[C++] 백준 2263 : 트리의 순회

왕방토 2023. 3. 5. 03:00
728x90

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

 

2263번: 트리의 순회

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

www.acmicpc.net

 

 

preorder / inorder / postorder 순회 개념 잘 알고있기

 

기본적으로 저 셋 중 최소 두 개가 주어진다면

원래 트리를 만들어 낼 수 있다고 함 신기ㅎ

*-> (추가) inorder가 반드시 포함되어야 만들 수 있음!!

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

 

4257번: 프리오더 포스트오더

이진 트리를 인오더(in-order)와 포스트오더(post-order)로 순회한 결과가 주어졌을 때, 프리오더(pre-order)로 순회한 결과를 찾을 수 있다. 또, 인오더와 포리오더로 순회한 결과가 주어졌을 때, 포스트

www.acmicpc.net

#include <iostream>
#include <vector>
using namespace std;

int inorder[100000];
int postorder[100000];

void pre_order(int in_s, int in_e, int post_s, int post_e) {
	if (in_s > in_e || post_s > post_e) return;

	int root = postorder[post_e];
	printf("%d ", root);
	int len = 0;
	for (int i = in_s; i <= in_e; i++) {
		if (inorder[i] == root) {
			break;
		}
		len++;
	}

	pre_order(in_s, in_s + len - 1, post_s, post_s + len - 1);
	pre_order(in_s + len + 1, in_e, post_s + len, post_e - 1);
}

int main() {
	int N;
	scanf("%d", &N);

	for (int i = 0; i < N; i++) {
		scanf("%d", &inorder[i]);
	}
	for (int i = 0; i < N; i++) {
		scanf("%d", &postorder[i]);
	}
	pre_order(0, N - 1, 0, N - 1);
}

'PS' 카테고리의 다른 글

[C++] 백준 2504 : 괄호의 값  (0) 2023.03.05
[C++] 백준 4256 : 트리  (0) 2023.03.05
[C++] 백준 1780 : 종이의 개수  (0) 2023.03.05
[C++] 백준 1080 : 행렬  (0) 2023.03.04
[C++] 백준 14226 : 이모티콘  (0) 2023.03.04
Comments