[ 백준 / 파이썬 ] 실버 1 - 1991.트리 순회

박제현·2024년 3월 1일
0

코딩테스트

목록 보기
63/101

난이도

문제

이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.

예를 들어 위와 같은 이진 트리가 입력되면,

  • 전위 순회한 결과 : ABDCEFG // (루트) (왼쪽 자식) (오른쪽 자식)
  • 중위 순회한 결과 : DBAECFG // (왼쪽 자식) (루트) (오른쪽 자식)
  • 후위 순회한 결과 : DBEGFCA // (왼쪽 자식) (오른쪽 자식) (루트)

가 된다.

입력

첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파벳 대문자로 매겨지며, 항상 A가 루트 노드가 된다. 자식 노드가 없는 경우에는 .으로 표현한다.

출력

첫째 줄에 전위 순회, 둘째 줄에 중위 순회, 셋째 줄에 후위 순회한 결과를 출력한다. 각 줄에 N개의 알파벳을 공백 없이 출력하면 된다.

예제

입력출력
7
A B C
B D .
C E F
E . .
F . G
D . .
G . .
ABDCEFG
DBAECFG
DBEGFCA

풀이

트리 클래스를 만드려다가, 생각해보니 딕셔너리를 활용하면 풀 수 있는 문제로 보여서 딕셔너리를 이용하여 풀었다.
파이썬이 참 이래서 편한 것 같다.

입력을 줄 때, 루트 노드와 자식 노드를 전부 주니까 사용할 수 있었던 것 같다.

전위, 중위, 후위 순회는 간단히 순서만 변경하면 되는 것이니, 전위 순회만 설명하자면..

루트 노드부터 시작하여 자식 노드들을 좌, 우 순으로 탐색하는데 자식이 있을 경우 계속해서 탐색한다. DFS 탐색과 일치한다.
탐색을 시작할 때, 해당 노드의 데이터를 출력해주면 된다.
그리고 탐색하면 끝.

코드

from sys import stdin
input = stdin.readline

def preorder(Tree, data):

    print(data, end='')

    if Tree[data][0] != '.':
        preorder(Tree, Tree[data][0])

    if Tree[data][1] != '.':
        preorder(Tree, Tree[data][1])

    return

def inorder(Tree, data):
    if Tree[data][0] != '.':
        inorder(Tree, Tree[data][0])

    print(data, end='')

    if Tree[data][1] != '.':
        inorder(Tree, Tree[data][1])

    return

def postorder(Tree, data):
    if Tree[data][0] != '.':
        postorder(Tree, Tree[data][0])

    if Tree[data][1] != '.':
        postorder(Tree, Tree[data][1])

    print(data, end='')

    return


def solution(N):

    Tree = {}

    for i in range(N):
        root, left, right = input().split()
        Tree[root] = [left, right]


    preorder(Tree, 'A')
    print()
    inorder(Tree, 'A')
    print()
    postorder(Tree, 'A')

solution(int(input()))

profile
닷넷 새싹

0개의 댓글