문제 풀이/[BaekJoon]

[BaekJoon] 1991 트리 순회 (Silver 1) - Python

조랩 2023. 1. 10. 01:04

문제

 

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

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

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

입출력 예시

 

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

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

 

입력예시1)

7
A B C
B D .
C E F
E . .
F . G
D . .
G . .

출력예시1)

ABDCEFG
DBAECFG
DBEGFCA

코드

 

import sys
input = sys.stdin.readline

N = int(input())
tree = {}
for _ in range(N):
    root, left, right = map(str, input().split())
    tree[root] = [left, right]

def forward():
    def _forward(x):
        print(x, end = '')
        if tree[x][0] != '.': _forward(tree[x][0])
        if tree[x][1] != '.': _forward(tree[x][1])
    _forward('A')

def inorder():
    def _inorder(x):
        if tree[x][0] != '.': _inorder(tree[x][0])
        print(x, end = '')
        if tree[x][1] != '.': _inorder(tree[x][1])
    _inorder('A')

def postorder():
    def _postorder(x):
        if tree[x][0] != '.': _postorder(tree[x][0])
        if tree[x][1] != '.': _postorder(tree[x][1])
        print(x, end = '')
    _postorder('A')

forward()
print()
inorder()
print()
postorder()

실행 화면


채점 결과

728x90