문제에서 입력은 전위 순회*로 노드들을 방문한 결과이다.
전위 순회는 루트노드 - 왼쪽 서브트리 - 오른쪽 서브트리 순으로 방문한다.
또한 이진 검색트리의 조건에 따라
루트노드 : 첫번재 인덱스
오른쪽 서브트리 : 루트보다 큰 값의 인덱스 ~ 끝까지
왼쪽 서브트리 : 루트 + 1 인덱스 ~ 루트보다 큰 값의 인덱스 - 1
임을 알 수 있으므로, 각 서브트리에 대해서도 재귀적으로 루트노드, 왼쪽 서브 트리, 오른쪽 서브트리를 찾는다.
만약 루트노드보다 큰 값이 없을 경우에는
루트 노드를 제외한 나머지 노드들이 왼쪽 서브트리에 있다는 의미이므로
for loop을 돌면서 right_idx의 값을 + 1 씩 증가시켜주어야 한다.
import sys
sys.setrecursionlimit(10 ** 6)
preorder_list = []
while True:
try:
preorder_list.append(int(sys.stdin.readline()))
except:
break
def postorder(start, end):
# 종료 조건
if start > end:
return
# 변수 초기화
# root : 해당 트리의 루트 노드 값
# right_idx 해당 트리의 오른족 서브 트리 인덱스
root = preorder_list[start]
right_idx = start + 1
# 루트보다 큰 값의 인덱스 찾기 (오른쪽 서브트리)
for i in range(start + 1, end + 1):
right_idx = i
if preorder_list[i] > root:
break
# print(f'root : {root}, right_idx : {right_idx}, right_val : {preorder_list[right_idx]}')
# 왼쪽, 오른쪽 서브트리에 대해서 재귀적으로 다시 트리를 타고 들어감
# 후위순회 (왼쪽, 오른쪽, 루트)
postorder(start + 1, right_idx - 1)
postorder(right_idx, end)
print(root)
postorder(0, len(preorder_list) - 1)