알고리즘/백준[baekjoon]

[baekjoon] 백준 5639번 : 이진 검색 트리 (by python 파이썬) 재귀

코딩하는이씨 2022. 9. 12. 20:00
728x90
반응형

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

 

5639번: 이진 검색 트리

트리를 전위 순회한 결과가 주어진다. 노드에 들어있는 키의 값은 106보다 작은 양의 정수이다. 모든 값은 한 줄에 하나씩 주어지며, 노드의 수는 10,000개 이하이다. 같은 키를 가지는 노드는 없다

www.acmicpc.net

 

정답 code

# 이진 검색 트리
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)
tree = []

while True:
    try:
        num = int(input())
        tree.append(num)
    except:
        break

def postorder(start,end):
    if start > end:
        return
    mid = end + 1
    for i in range(start+1,end+1):
        if tree[start] < tree[i]:
            mid = i #루트보다 처음으로 커지는수를 오른쪽 프리오더의 시작
            break
    postorder(start + 1, mid - 1) #왼쪽 프리오더 순환  
    postorder(mid, end) # 오른쪽 프리오더 순환
    print(tree[start]) 

postorder(0,len(tree)-1)

 

solution

이번 문제의 핵심은 규칙에 있다.

  • 노드의 왼쪽 서브트리에 있는 모든 노드의 키는 노드의 키보다 작다.
  • 노드의 오른쪽 서브트리에 있는 모든 노드의 키는 노드의 키보다 크다.
  • 왼쪽, 오른쪽 서브트리도 이진 검색 트리이다.

왼쪽 서브트리의 키는 노드의 키보다 작고, 오른족 서브트리의 키는 노드의 키보다 크다는걸 이용해야된다.

 

전위순회한 입력이 들어오는데 전위순회는 가장 처음은 최상위 노드이고,

이 노드의 오른쪽 서브트리는 노드키보다 커야됨으로 처음으로 노드보다 커지는 수를 찾으면 그 수부터 오른쪽 서브트리가 되고

그 수 전까지는 왼쪽 서브리트리가 된다.

 

이를 이용하여 왼쪽 순환 오른쪽 순환을 해준뒤 출력해주면 후위 순회의 값을 구할 수 있다.

 

 

추가로 몇개의 입력을 받을지 모르는 상태이기때문에,  

try except 예외처리를 이용하여 입력이 없을때 까지 입력을 받아주어야 된다.

728x90
반응형