알고리즘/백준

5639 파이썬- 트리

남승현 2024. 1. 7. 18:52

배열상에서 생각 하려하지 않고 트리에만 집중하다가 시간 많이 날렸다ㅠㅠ

구글링참고해 풀어서 나중에 다시 한번 풀어보기!!

 

트리 순회의 핵심은 루트노드, 왼쪽트리, 오른쪽 트리 이렇게 세 개로 나누어 재귀함수 이용해 진행해야 한다는 점이다

-> 이 문제의 경우 몇 번째 인덱스부터 몇 번째 인덱스까지가 왼쪽트리,  몇 번째 인덱스부터 몇 번째 인덱스까지가 오른쪽 트리인지 인덱스 구해 재귀함수 거치게 해주면 된당

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

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

def post(start, end):
    if start > end:
        return
    mid = end + 1
    for i in range(start + 1, end + 1):
        if tree[i] > tree[start]:
            mid = i
            break
    post(start + 1, mid - 1) #왼쪽 트리
    post(mid, end) #오른쪽 트리
    print(tree[start]) #루트 노드

post(0, len(tree) - 1)

 

 

<세부설명>

 

* 계속 입력을 받되, 숫자가 아닌 값을 입력하면 입력을 그만 받도록 구현하는 것부터 막혀서 구글링을 통해 알아냄!!

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

 

* 어디까지를 왼쪽트리인지 하기 위해 mid 값을 구해야 하는데 여기가 키 포인트

 

* mid=end+1로 초기화 하는 이유 (바로 이해 안됐던 부분)

-> 오른쪽 자식 노드가 비어 mid 값이 없는 경우 오류 나지 않게 하기 위해 mid값을 default값으로 설정해주어야 하는데,

   이때 왜 하필 end+1로 초기화하냐면 언제 이 함수를 끝내줄지 정해야해서!!!!! 계속 재귀함수 돌게 할 수 없어서 끝내야함

   끝내주기 위해 특이점을 만들고 이를 mid=end+1로 하고 start>end면 끝낸다는 조건을 추가해주어 함수 끝내는 지점을       정해줌

-> 재귀함수는 항상 언제 끝내줄 지 조건을 통해 지정해주어야함을 잊지말기!!