DolphinDash

백준 1991번: 트리 순회 (Python) 본문

PS/Solve

백준 1991번: 트리 순회 (Python)

DolphinDash 2023. 5. 20. 16:44
 

1991번: 트리 순회

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

www.acmicpc.net

트리의 순회 방식 3가지를 알면 쉽게 풀 수 있는 문제다. 

Preorder (전위 순회)

루트부터 먼저 방문한 다음 왼쪽 하위 트리, 오른쪽 하위 트리 순으로 방문하는 방식

Inorder (중위 순회)

왼쪽 하위 트리 먼저 방문하고 이후 루트 트리, 오른쪽 하위 트리 순으로 방문하는 방식

Postorder (후위 순회)

왼쪽 하위 트리 먼저 방문한 후 이후 오른쪽 하위 트리, 마지막으로 루트 트리를 방문하는 방식

 

딕셔너리로 노트 이름을 저장해 set으로 양쪽 자식들을 저장했다.

n = int(input())
nodes = {}
for i in range(n):
    node, leftnode, rightnode = input().split()
    nodes[node] = (leftnode, rightnode)

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

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

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

preorder("A")
print()
inorder("A")
print()
postorder("A")

위 3가지 방식이 있는데 코드로는 재귀로 더 간단하게 나타낼 수 있다. 전위 중위 후위 헷갈릴 수 있는데 루트가 언제 방문하는지를 생각하면서 나누면 방지할 수 있다. 

전위 = 루트를 처음 방문, 중위 = 루트를 중간에 방문, 후위 = 루트를 나중에 방문

 

'PS > Solve' 카테고리의 다른 글

백준 1158번: 요세푸스 문제 (Python)  (0) 2023.05.23
백준 1010번: 다리 놓기 (Python)  (0) 2023.05.23
백준 16953번: A → B (Python)  (0) 2023.05.19
백준 1629번: 곱셈 (Python)  (0) 2023.04.06
백준 5397번: 키로거 (Python)  (0) 2023.04.06