[백준] 트리 순회(1991)

JP·2022년 11월 13일

boj

목록 보기
4/4
  • 전위 순회(preorder traversal): (루트)(왼쪽자식)(오른쪽자식)
  • 중위 순회(inorder traversal): (왼쪽자식)(루트)(오른쪽자식)
  • 후위 순회(postorder traversal): (왼쪽자식)(오른쪽자식)(루트)
import sys

N = int(sys.stdin.readline().strip())
graph = {}
stack = []

for _ in range(N):
    node_info = list(sys.stdin.readline().strip().split(" "))
    root = node_info[0]
    left = node_info[1] if node_info[1] != '.' else 0
    right = node_info[2] if node_info[2] != '.' else 0
    graph[root] = [left, right]

def preorder(graph, start):
    stack.append(start)
    left = graph[start][0]
    right = graph[start][1]
    if left != 0:
        preorder(graph, left)
    if right != 0:
        preorder(graph, right)

def inorder(graph, start):
    left = graph[start][0]
    right = graph[start][1]
    if left != 0:
        inorder(graph, left)
        stack.append(start)
    else:
        stack.append(start)
    if right != 0:
        inorder(graph, right)

def postorder(graph, start):
    left = graph[start][0]
    right = graph[start][1]
    if left != 0:
        postorder(graph, left)
    if right != 0:
        postorder(graph, right)
    stack.append(start)

preorder(graph, 'A')
for i in range(len(stack)):
    print(stack[i], end='')
print()
stack =[]
inorder(graph, 'A')
for i in range(len(stack)):
    print(stack[i], end='')
print()
stack =[]
postorder(graph, 'A')
for i in range(len(stack)):
    print(stack[i], end='')

경우의 수 따져가며, if문 순서 배치에 애먹었던 문제. 쉽다곤 하는데, 나는 좀 애먹었다.
좋은 솔루션을 찾아서 공유하고자 함.

import sys
input = sys.stdin.readline
sys.setrecursionlimit(int(1e9))

N = int(input())
tr = {} ##dict로 트리 설정
for _ in range(N):
    root,left,right = input().rstrip().split()
    tr[root] = [left,right]

def preorder(root):
    if root !='.':
        print(root, end='')
        preorder(tr[root][0])
        preorder(tr[root][1])
def inorder(root):
    if root !='.':
        inorder(tr[root][0])
        print(root,end='')
        inorder(tr[root][1])
def postorder(root):
    if root !='.':
        postorder(tr[root][0])
        postorder(tr[root][1])
        print(root, end='')

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

ㅏ..ㅋㅋㅋ...
내 알고리즘도 위의 솔루션과 로직은 같지만, 제 3자가 읽었을 때 해석하기 힘들다는 점에서 '좋은 코드'는 아니다.

profile
human being acting like tiger

0개의 댓글