HwangHub

[data structure/tree] 백준 1991. 트리 순회 본문

workspace/알고리즘

[data structure/tree] 백준 1991. 트리 순회

HwangJerry 2023. 5. 12. 10:10

 

 

1991번: 트리 순회

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

www.acmicpc.net

기본 개념

한국어도 직역한 단어지만, 영어로 트리 순회 개념을 이해해두고 넘어가면 쉽다.

트리 순회 개념은 root 노드를 언제 들르냐에 따라 나뉜다.

 

preorder : 먼저 root부터 들르고 왼쪽자식 순회, 그리고 오른쪽 자식 순회

def preorder(root):
    if root != '.':
        print(root, end='')     # root
        preorder(tree[root][0]) # left
        preorder(tree[root][1]) # right

inorder : 왼쪽 자식 순회, 그리고 root 방문(왼쪽과 오른쪽 사이의 "in"), 이후 오른쪽 자식 방문

def inorder(root):
    if root != '.':
        inorder(tree[root][0])  # left
        print(root, end='')     # root
        inorder(tree[root][1])  # right

postorder : 왼쪽 자식 순회, 오른쪽 자식 순회, 그리고 나서 root 방문

def postorder(root):
    if root != '.':
        postorder(tree[root][0]) # left
        postorder(tree[root][1]) # right
        print(root, end='')      # root

 

문제 풀이

위 이해한 내용을 바탕으로 해당 문제에 대한 코드를 작성하면,

import sys
input = sys.stdin.readline

t = int(input())
tree = dict() # {}

for _ in range(t):
    root, left, right = input().split()
    tree[root] = [left, right]

def preorder(root):
    if root != '.':
        print(root, end='')     # root
        preorder(tree[root][0]) # left
        preorder(tree[root][1]) # right

def inorder(root):
    if root != '.':
        inorder(tree[root][0])  # left
        print(root, end='')     # root
        inorder(tree[root][1])  # right

def postorder(root):
    if root != '.':
        postorder(tree[root][0]) # left
        postorder(tree[root][1]) # right
        print(root, end='')      # root

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

 

'workspace > 알고리즘' 카테고리의 다른 글

[DFS] 백준 13023. ABCDE  (0) 2023.05.17
[BFS] 2644 촌수 계산  (1) 2023.05.12
[DP] 11726. 2 x N 타일링  (0) 2023.05.09
[딕셔너리] boj 18870. 좌표 압축  (0) 2023.05.09
[우선순위큐] boj 1417. 국회의원 선거  (1) 2023.05.09
Comments