최대 1 분 소요

1. 문제

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

  • 트리 문제
// 문제
n개의 정점을 갖는 이진 트리의 정점에 
1부터 n까지의 번호가 중복 없이 매겨져 있다. 
이와 같은 이진 트리의 인오더와 포스트오더가 주어졌을 , 
프리오더를 구하는 프로그램을 작성하시오.

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

// 출력
첫째 줄에 프리오더를 출력한다.

// 예제 입력 1 
3
1 2 3
1 3 2

// 예제 출력 1 
2 1 3


2. 핵심 아이디어

  • PostOrder에서 부모 노드를 찾음
  • 부모 노드는 InOrder에서 기준점이 되어 좌우를 나눔
  • 좌우를 순회하며 과정을 반복


3. Python 문제풀이

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()))
arr = [0 for i in range(n+1)]

for i in range(n) :
  arr[inOrder[i]] = i

def post(start1, end1, start2, end2) :
  if start1 > end1 or start2 > end2 :
    return
  parent = postOrder[end2]
  print(parent, end = " ")

  left = arr[parent] - start1
  right = end1 - arr[parent]

  post(start1, start1+left-1, start2, start2+left-1)
  post(end1-right+1, end1, end2-right, end2-1)

post(0, n-1, 0, n-1)


4. Java 문제풀이


댓글남기기