GitHub

https://github.com/Choidongjun0830

파이썬 알고리즘 문제 풀이

Baekjoon Online Judge 4256번 파이썬. 분할정복.

gogi masidda 2023. 2. 7. 17:05

문제 링크
https://www.acmicpc.net/problem/4256

4256번: 트리

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 노드의 개수 n이 주어진다. (1 ≤ n ≤ 1,000) BT의 모든 노드에는 1부터 n까지 서로 다른 번호가 매겨져 있다. 다음

www.acmicpc.net


전위순회한 결과의 맨 앞 노드는 전체 트리의 루트이다.
중위순회한 결과에서 전체 트리의 루트를 기준으로 왼쪽은 왼쪽 서브트리이고, 오른쪽은 오른쪽 서브트리이다.

후위순회는 왼쪽, 오른쪽, 루트 순으로 출력하는 것이다. 그래서 전체 트리의 루트(root)를 기준으로 왼쪽 먼저 함수를 실행하고, 다음으로 오른쪽을 실행한다. 그리고 마지막에 root를 출력한다.


정답 코드

import sys
  
def dnc(preorder,inorder):
  if not preorder:
    return
  if len(preorder)==1:
    print(preorder[0], end=' ')
    return
  if len(preorder)==2:
    print(preorder[1],preorder[0], end=' ')
    return

  root = preorder[0] #전위순회의 첫번째 오는 수는 전체 트리의 루트
  root_index = inorder.index(root)

  left_pre = preorder[1:root_index+1]
  left_in = inorder[:root_index]
  dnc(left_pre,left_in)

  right_pre = preorder[root_index+1:]
  right_in = inorder[root_index+1:]
  dnc(right_pre,right_in)

  print(preorder[0], end=' ')

T = int(sys.stdin.readline())
for i in range(T):
  N = int(sys.stdin.readline())
  preorder = list(map(int, sys.stdin.readline().split()))
  inorder = list(map(int, sys.stdin.readline().split()))
  dnc(preorder,inorder)
  print()
728x90