Algorithm Problems

[백준][Python] 1991번 트리순회 - 트리

WakaraNai 2021. 8. 26. 23:51
728x90
반응형

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

 

1991번: 트리 순회

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

www.acmicpc.net

 

 

 

Python

import sys
input = sys.stdin.readline

tree = {}

n = int(input().rstrip())
a, b, c = input().split()
tree[a] = (b, c)
root = a
for _ in range(n-1):
    a, b, c = input().split()
    tree[a] = (b, c)


def pre(now):
    print(now, end="")
    if tree[now][0] != ".":
        pre(tree[now][0])
    if tree[now][1] != ".":
        pre(tree[now][1])


def mid(now):
    if tree[now][0] != ".":
        mid(tree[now][0])
    print(now, end="")
    if tree[now][1] != ".":
        mid(tree[now][1])


def post(now):
    if tree[now][0] != ".":
        post(tree[now][0])
    if tree[now][1] != ".":
        post(tree[now][1])
    print(now, end="")


pre(root)
print()
mid(root)
print()
post(root)

 

 

 

+) 덧붙임

시간 단축을 위해 print() 함수를 여러 번 호출하기보다는 

문자열 이어붙이기 방식으로 답을 모아보았다.

하지만 10ms 더 늦어졌다.

 

print() 함수를 여러번 출력해도 될 때는 그렇게 하는 것이 조금 더 빠른 결과를 볼 수 있다.

 

import sys
input = sys.stdin.readline

tree = {}

n = int(input().rstrip())
a, b, c = input().split()
tree[a] = (b, c)
root = a
for _ in range(n-1):
    a, b, c = input().split()
    tree[a] = (b, c)


ans = ["", "", ""]


def pre(now):
    global ans
    ans[0] += now
    if tree[now][0] != ".":
        pre(tree[now][0])
    if tree[now][1] != ".":
        pre(tree[now][1])


def mid(now):
    global ans
    if tree[now][0] != ".":
        mid(tree[now][0])
    ans[1] += now
    if tree[now][1] != ".":
        mid(tree[now][1])


def post(now):
    global ans
    if tree[now][0] != ".":
        post(tree[now][0])
    if tree[now][1] != ".":
        post(tree[now][1])
    ans[2] += now


pre(root)
mid(root)
post(root)
print("\n".join(ans))
728x90
반응형