예제 입력에서 8개의 노드가 있고
3 6 5 4 8 7 1 2
5 6 8 4 3 1 2 7
가 있을 때,우리는 전위 순회가 (루트 노드) -> (왼쪽 서브 트리) -> (오른쪽 서브 트리) 순으로 탐색하는 것을 알기 때문에
3
이 루트 노드인 것을 알고 있다.중위 순회는 (왼쪽 서브 트리)->(루트 노트)->(오른쪽 서브 트리) 으로 순회하므로 루트노드인 3
의 위치를 알면
0 ~ (루트노드의 인덱스 - 1)
의 인덱스(루트노드의 인덱스 + 1) ~ 끝
의 인덱스임을 알 수 있다.
이렇게 찾은 각각의 왼쪽 오른쪽 서브트리에 대해 더 이상 쪼갤 수 없을 때까지
설명이 부족한 것 같지만 코드와 함께 본다면 더 이해가 빨리 될 것 같다.
import sys
input = sys.stdin.readline
# 테스트 케이스의 개수
cases = int(input())
def get_postorder(preorder, inorder):
# 전위 순위의 첫인덱스는 루트 노드
root = preorder[0]
# 중위 순위에서 루트 노드는 가운데 있으므로
# 루트 노드의 인덱스를 통해 왼쪽 서브트리와 오른쪽 서브트리로 나눌 수 있다.
root_idx = inorder.index(root)
left = inorder[:root_idx]
right = inorder[root_idx + 1:]
post_left, post_right = [], []
# 후위 순회의 순서에 맞게 (왼쪽)(오른쪽)(루트) 의 순서로 답을 찾아나간다
# 이때 왼쪽, 오른쪽 서브트리에 대해 재귀적으로 각각의 루트, 왼쪽, 오른쪽 서브트리를 찾아서 후위 순회로 바꾼다.
if left:
post_left = get_postorder(preorder[1:root_idx + 1], inorder[:root_idx])
if right:
post_right = get_postorder(preorder[root_idx + 1:], inorder[root_idx + 1:])
return post_left + post_right + [root]
for _ in range(cases):
n = int(input())
# preorder : 전위 순위의 결과, inorder : 중위 순위의 결과
preorder = list(map(int, input().split()))
inorder = list(map(int, input().split()))
# post_list : 후위 순위의 결과 값 저장
post_list = get_postorder(preorder, inorder)
print(*post_list)