https://www.acmicpc.net/problem/2263
2263번: 트리의 순회
첫째 줄에 n(1≤n≤100,000)이 주어진다. 다음 줄에는 인오더를 나타내는 n개의 자연수가 주어지고, 그 다음 줄에는 같은 식으로 포스트오더가 주어진다.
www.acmicpc.net
in order : L root R
post order : L R root
pre order : root L R
post의 마지막은 root다.
1. post-order에서 현재 범위에서 루트가 어떤 노드인지 파악한다.
2. in-order에서 왼쪽 서브트리와 오른쪽 서브트리의 범위를 파악한다.
3. 루트를 출력하고 각 서브트리가 있다면 재귀호출한다.
import sys
sys.setrecursionlimit(10**9)
input = sys.stdin.readline
N = int(input())
in_order = list(map(int, input().split()))
post_order = list(map(int, input().split()))
node_idx = [in_order[i] - 1 for i in range(N)]
# in-order에서의 범위 : [L1 : R1]
# post-order에서의 범위 : [L2 : R2]
def pre_order(L1, R1, L2, R2):
# in-order에서 root의 인덱스
root = node_idx[post_order[R2] - 1]
# 왼쪽 서브트리의 크기
K = root - L1
print(in_order[root], end=' ')
if L1 != root:
pre_order(L1, root - 1, L2, L2 + K - 1)
if R1 != root:
pre_order(root + 1, R1, L2 + K, R2 - 1)
pre_order(0, N - 1, 0, N - 1)
'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ 2302] 극장 좌석 (0) | 2020.04.25 |
---|---|
[BOJ 15480] LCA와 쿼리 (0) | 2020.04.24 |
[BOJ 5214] 환승 (0) | 2020.04.21 |
[BOJ 16639] 괄호 추가하기 3 (0) | 2020.03.14 |