youngseo's TECH blog

[PS | 한 번에 맞자!] 백준 4256 본문

알고리즘/세부구현

[PS | 한 번에 맞자!] 백준 4256

jeonyoungseo 2023. 7. 15. 11:38

0. 문제

트리

 

4256번: 트리

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

www.acmicpc.net


1. 문제 생각

전위순회, 중위순회, 후위순회의 핵심은 규칙과 재귀이다.
재귀에서도 사실상 어디에서 재귀로 진입하는가(반환하는가) 가 가장 중요하다. -> 기초 설명

위 문제에서도 전위, 중위 순회일 떄 규칙적으로 왼쪽/오른쪽으로 빠지는 것이 규칙적으로 진행됨을 알 수 있다.
따라서 recursion을 전위, 중위 순회에 따라 root 노드 -> left 노드 -> right 노드로 들어가도록 구현하고

if (currentNode){
Visit(currentNode);
Postorder(currentNode -> leftChild);
Postorder(currentNode -> rightChild);
	Visit(currentNode);
}

그 후 우리는 후위 순회를 구현할 것이므로 위의 함수처럼 맨 나중에 node를 visit하면 된다.


2. 문제 구현

import sys
input = sys.stdin.readline

def recursion(preorder, inorder):
    
    if not preorder:
        return

    node = preorder[0]
    idx = inorder.index(node)
	# 전위순회를 반환해야 하면 여기에서 print
    recursion(preorder[1:idx+1], inorder[:idx])
	# 중위순회를 반환해야 하면 여기에서 print
    recursion(preorder[idx+1:], inorder[idx+1:])
    # 후위순회를 반환해야 하면 여기에서 print
    print(node, end=' ')

t=int(input())
for _ in range(t):
    n=int(input())
    preorder = list(map(int,input().split()))
    inorder = list(map(int,input().split()))
    recursion(preorder, inorder)
    print()