Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
more
Archives
Today
Total
관리 메뉴

JH 개발 블로그

백준 파이썬 2263 트리의 순회 본문

코딩테스트/백준

백준 파이썬 2263 트리의 순회

쿠우우훈 2021. 12. 30. 10:25

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

 

2263번: 트리의 순회

첫째 줄에 n(1 ≤ n ≤ 100,000)이 주어진다. 다음 줄에는 인오더를 나타내는 n개의 자연수가 주어지고, 그 다음 줄에는 같은 식으로 포스트오더가 주어진다.

www.acmicpc.net

 

코드

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

n = int(input())
inorder = list(map(int,input().split()))
postorder = list(map(int,input().split()))
position = [0]*(n+1)
for i in range(n):
    position[inorder[i]] = i

def preorder(istart,iend,pstart,pend):
    if istart > iend or pstart > pend:
        return

    root = postorder[pend]
    print(root,end=' ')

    left_cnt = position[root] - istart
    right_cnt = iend - position[root]

    preorder(istart,position[root]-1,pstart,pstart+left_cnt-1)
    preorder(position[root]+1,iend,pend-right_cnt,pend-1)


preorder(0,n-1,0,n-1)

inorder(중위순회), postorder(후위순회)를 통해 preorder(전위순회)를 구할 수 있습니다.

 

1. postorder의 맨 마지막 정점은  preorder의 처음 정점입니다.

postorder는 (왼쪽자식)(오른쪽자식)(정점) 인 반면 preorder는 (정점)(왼쪽자식)(오른쪽자식) 이기 때문입니다.

 

2. postorder의 맨 마지막 정점을 이용해 inorder에서 왼쪽자식의 개수, 오른쪽자식의 개수를 알 수 있습니다.

inorder는 (왼쪽자식)(정점)(오른쪽자식) 이기 때문에 inorder에서의 정점의 인덱스를 알고 있으면 왼쪽자식의 개수, 오른쪽자식의 개수를 알 수 있습니다.

 

3. 왼쪽자식, 오른쪽자식으로 나눠 왼쪽자식 먼저 재귀를 돌면서 전위순회를 찾아냅니다.

 

 

https://ca.ramel.be/114 

 

백준 2263번: 트리의 순회 (Python)

접근 재귀를 이용하여 문제를 풀 수 있다. 포스트오더의 마지막 숫자는 전체 트리의 루트이다. 인오더의 특성을 이용, 루트를 기준으로 왼쪽트리, 오른쪽트리의 노드 수를 구할 수 있다. 왼쪽 트

ca.ramel.be

참고한 블로그입니다.

'코딩테스트 > 백준' 카테고리의 다른 글

백준 1201 파이썬 NMK  (0) 2021.12.31
백준 파이썬 1074 Z  (0) 2021.12.31
백준 파이썬 1991 트리 순회  (0) 2021.12.30
백준 파이썬 11729 하노이 탑 이동 순서  (0) 2021.12.29
백준 파이썬 1780 종이의 개수  (0) 2021.12.29
Comments