Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
Tags
- HTML
- Java
- dp
- vscode
- 다이나믹 프로그래밍
- 후위순회
- 최단거리
- js
- 너비우선탐색
- 깊이우선탐색
- BFS
- 구현
- 시뮬레이션
- Backjoon
- python
- 최소신장트리
- dfs
- webpack
- css
- Java #Backjoon #Algorithm #구현 #시뮬레이션
- React
- 그래프
- Prettier
- 최장부분증가수열
- algorithm
- 전위순회
- eslint
- MST
- LIS
- nodejs
Archives
- Today
- Total
ULISIA's Developer Life
[Backjoon] 5639 이진 검색 트리 Python 문제 풀이 본문
출처 : 5639번 이진 검색 트리

문제해석
전위 순회 결과
50 30 24 5 28 45 98 52 60
첫 원소가 루트 노드(전위 순회)
왼쪽 서브 트리는 루트 노드보다 작은 원소
오른쪽 서브 트리는 루트 노드보다 큰 원소
전위 순회이므로 루트 노드보다 큰 원소가 나오는 지점이 왼쪽 서브 트리와 오른쪽 서브 트리를 나누는 지점과 같다.
50 /30 24 5 28 45/ 98 52 60
50=루트 노드, 3045=왼쪽 서브트리, 9860= 오른쪽 서브트리
위 결과를 활용하여 후위 순회를 해주면 된다.
해답코드
#이진 검색 트리
import sys
sys.setrecursionlimit(10**9)
input = sys.stdin.readline
pre = []
while True:
try:
pre.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 pre[i] > pre[start]:
mid = i
break
post(start+1,mid-1) #왼쪽 트리
post(mid,end) #오른쪽 트리
print(pre[start]) #루트 노드
post(0, len(pre)-1)mid를 end + 1로 초기화하는 이유
만약 모든 원소가 루트 노드보다 작은 경우
post(start + 1, mid - 1) : start + 1, end 가 삽입, 즉 루트 노드를 제외한 트리
post(mid, end) : end + 1, end 가 삽입되어 if start > end: return에 의해 리턴됨 이는 오른쪽 노드가 없음을 의미
'Algorithm > Backjoon' 카테고리의 다른 글
| [Backjoon] 2178 미로 탐색 Python 문제 풀이 (0) | 2023.07.23 |
|---|---|
| [Backjoon] 1068 트리 Python 문제 풀이 (0) | 2023.07.22 |
| [Backjoon] 1916 최소비용 구하기 Python 문제 풀이 (0) | 2023.07.19 |
| [Backjoon] 1197 최소 스패닝 트리 Python 문제 풀이 (0) | 2023.07.18 |
| [Backjoon] 24479 알고리즘 수업 - 깊이 우선 탐색 1 Python 문제 풀이 (0) | 2023.07.17 |