농담곰담곰이의곰담농

5639. 이진 검색 트리

by 브이담곰

 

 

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

유형 : 재귀

문제 풀이: 이진 검색 트리의 특징과 전위 순회를 했을 때의 배열의 규칙을 찾아 범위를 줄여나가 탐색하며 오른쪽 서브트리와 왼쪽 서브트리를 구분해서 문제를 푼다.

 

 

해당 노드보다 큰 원소가 나올 때까지 탐색한다.

큰 원소가 나오면 오른쪽 서브트리를 의미하고 큰 원소의 인덱스부터 오른쪽 서브트리.

해당 노드 인덱스 + 1 부터 큰 원소의 인덱스 -1 까지는 왼쪽 서브트리임을 알 수 있다.

 

 

이제부터 위의 규칙을 이용해 재귀를 돌린다.

 

재귀를 계속 돌리면 결국 리프 노드까지 탐색이 완료되고, 같은 방법으로 왼,오 노드를 구분하여

후위 순회의 순서대로 print를 해주면 된다.

 

 

⬇️ 코드

import sys
input=sys.stdin.readline # input함수 바꾸기
sys.setrecursionlimit(15000) # 10^8 까지 늘림.
# BST
node = list()
        
        
def post_order_print(start, end):
    if start >= end: # 오른쪽 노드가 없을 경우
        return
    
    root = node[start] #root의 노드 번호
    delim = start + 1 #왼오 가 갈리는 인덱스
    
    while delim<end: #인덱스 벗어남녀안되ㅣ니까아
        if root < node[delim]: break #루트보다 큰 친구가 나올때까지 검색
        delim+=1 #delim의 값을 업해주면서 찾음
        
    #while문 빠져나오면~ 루트보다 커졌을때의 index가 delim = 즉 오른쪽 서브트리의 루트를 찾은 것
    post_order_print(start+1, delim)# 왼쪽 서브트리의 루트~ 왼쪽 노드의 마지막 인덱스
    post_order_print(delim, end) #오른쪽노드의 루트~ 끝
    
    print(root) #루트 프린트
         
while True:
    try:
        new_node = int(input())
        node.append(new_node)
    except:
        break
    
post_order_print(0, len(node))

 

'Coding Test > Baekjoon' 카테고리의 다른 글

11725. 트리의 부모 찾기  (0) 2024.07.18
1197. 최소 스패닝 트리  (0) 2024.07.18
2630. 색종이 만들기  (0) 2024.07.11
2805. 나무 자르기  (0) 2024.07.11
3109. 뱀  (0) 2024.07.10

블로그의 정보

농담곰담곰이의곰담농

브이담곰

활동하기