2263번: 트리의 순회
첫째 줄에 n(1≤n≤100,000)이 주어진다. 다음 줄에는 인오더를 나타내는 n개의 자연수가 주어지고, 그 다음 줄에는 같은 식으로 포스트오더가 주어진다.
www.acmicpc.net
<내 코드>
import sys
sys.setrecursionlimit(10**6)
n = int(input())
in_order = list(map(int, input().split()))
post_order = list(map(int, input().split()))
pos = [0]*(n+1)
for i in range(n):
pos[in_order[i]] = i
# 전위 순회
def divide(in_start, in_end, p_start, p_end):
if(in_start > in_end) or (p_start > p_end):
return
parents = post_order[p_end] # 후위순회에서 부모노드 찾기
print(parents, end=" ")
left = pos[parents] - in_start # 왼쪽인자 갯수
right = in_end - pos[parents] # 오른쪽인자 갯수
divide(in_start, in_start+left-1, p_start, p_start+left-1) # 왼쪽 노드
divide(in_end-right+1, in_end, p_end-right, p_end-1) # 오른쪽 노드
divide(0, n-1, 0, n-1)
후위 순회에서 부모 노드를 찾아 중위 순회에서 기준으로 삼아 왼쪽, 오른쪽 나눈다. 그리고 왼쪽 자식 트리 노드, 오른쪽 자식 트리 노드를 순회하며 앞의 과정을 반복한다.
반응형
'알고리즘 문제풀기 > 백준 - Python' 카테고리의 다른 글
[백준 1449] 수리공 항승 - Python(그리디, 정렬) (0) | 2020.10.08 |
---|---|
[백준 2644] 촌수계산 - Python(그래프 탐색, BFS) (0) | 2020.10.08 |
[백준 9372] 상근이의 여행 - Python(그래프) (0) | 2020.10.04 |
[백준 1967] 트리의 지름 - Python (트리, DFS) (0) | 2020.10.04 |
[백준 11725] 트리 부모 찾기 - Python (DFS, 트리) (0) | 2020.10.03 |