Programming/백준

[골드 4] 백준 5639 - 이진 검색 트리 (파이썬)

pental 2025. 5. 8. 21:34

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

풀이

전위 순회를 후위 순회로 변환하는 구현을 진행해야한다.

즉, 전위 순회 결과가 주어졌을 때, 해당 트리의 후위 순위 결과를 출력해야한다.

입력은 전위 순회 결과이며, 이진 검색 트리 조건이 적용된다.

  • 왼쪽 자식 < 부모 < 오른쪽 자식
def postorder(start, end):
    if start >= end:
        return
    
    root = preorder[start]  # 현재 서브트리의 루트

    # 오른쪽 서브트리의 시작 인덱스를 찾기
    right = start + 1
    while right < end and preorder[right] < root:
        right += 1

    # 왼쪽 서브트리 순회
    postorder(start + 1, right)

    # 오른쪽 서브트리 순회
    postorder(right, end)

    # 루트 출력 (후위 순회이므로 마지막에 출력)
    print(root)

preorder[start]는 항상 서브트리의 루트 노드이며, 그 다음부터 preorder[right] < root 이면 왼쪽 서브트리에 속한다.

조건이 깨지는 최초의 right는 오른쪽 서브트리의 시작점이며, 그 구간들을 기준으로 재귀적으로 분할하여 탐색한다.

코드

# 백준 5639 - 이진 검색 트리
# 분류 : 트리

import sys
sys.setrecursionlimit(10 ** 6)
input = sys.stdin.readline

preorder = []
while True :
    try :
        preorder.append(int(input()))
    except :
        break

def postorder(start, end) :
    if start >= end :
        return
    root = preorder[start]

    right = start + 1
    while right < end and preorder[right] < root :
        right += 1
    
    postorder(start + 1, right)
    postorder(right, end)

    print(root)

postorder(0, len(preorder))