백준 알고리즘

[백준/Python] 1991_트리 순회

헝그리개발자 2021. 6. 29. 15:23

문제

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

 

1991번: 트리 순회

첫째 줄에는 이진 트리의 노드의 개수 N(1≤N≤26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 영문자

www.acmicpc.net

풀이

입력받은 간선들을 딕셔너리 타입의 edges 변수에 저장합니다.

재귀함수를 이용해서 전위순회, 중위순회, 후위순회 함수를 선언합니다.

전위 순회일 때, current 노드 출력 -> left_child 노드를 매개변수로 전위 순회 -> right_child 노드를 매개변수로 전위 순회

중위 순회일 때, left_child 노드를 매개변수로 중위 순회 -> current 노드 출력 -> right_child 노드를 매개변수로 중위 순회

후위 순회일 때, left_child 노드를 매개변수로 후위 순회 -> right_child 노드를 매개변수로 후위 순회 -> current 노드 출력

코드

import sys


def preorder(node):
    if node != '.':
        print(node, end='')
        preorder(edges[node][0])
        preorder(edges[node][1])


def inorder(node):
    if node != '.':
        inorder(edges[node][0])
        print(node, end='')
        inorder(edges[node][1])


def postorder(node):
    if node != '.':
        postorder(edges[node][0])
        postorder(edges[node][1])
        print(node, end='')


n = int(sys.stdin.readline().rstrip())
edges = dict()
for i in range(n):
    parent, left_child, right_child = sys.stdin.readline().rstrip().split()
    edges[parent] = [left_child, right_child]
preorder('A')
print()
inorder('A')
print()
postorder('A')