- Reference
- postorder의 마지막 루트는 preorder의 처음 루트
- postorder: 왼쪽 -> 오른쪽 -> 루트
- preorder: 루트 -> 왼쪽 -> 오른쪽
- postorder의 마지막 루트를 이용하여 inorder에서 왼쪽, 오른쪽 자식의 개수를 알 수 있음
- inorder: 왼쪽 -> 루트 -> 오른쪽
- 즉, inorder에서의 루트의 index를 알고 있으면 왼쪽, 오른쪽 자식의 개수를 알 수 있게 됨
Solution
import sys
from typing import List
sys.setrecursionlimit(10 ** 5)
def solution(n: int, inorder: List[int], postorder: List[int]) -> List[int]:
answer = []
# inorder 값의 index를 저장
inorder_index = [0] * (n + 1)
for i in range(n):
inorder_index[inorder[i]] = i
def preorder(in_start, in_end, post_start, post_end):
# 재귀 종료
if in_start > in_end or post_start > post_end:
return
# 현 트리에서 최상위 루트 (postorder의 마지막)
root = postorder[post_end]
answer.append(root)
# inorder에서의 root 위치 찾기
in_root = inorder_index[root]
# 왼쪽 자식트리 노드의 개수
left_node = in_root - in_start
preorder(in_start, in_root - 1, post_start, post_start + left_node - 1)
# 오른쪽 자식트리 노드의 개수
right_node = in_end - in_root
preorder(in_root + 1, in_end, post_end - right_node, post_end - 1)
preorder(0, n - 1, 0, n - 1)
return answer
n = int(sys.stdin.readline().rstrip())
inorder = list(map(int, sys.stdin.readline().rstrip().split()))
postorder = list(map(int, sys.stdin.readline().rstrip().split()))
print(*solution(n, inorder, postorder))
Leave a comment