728x90
문제
이진 트리를 입력받아 전위 순회

예를 들어 위와 같은 이진 트리가 입력되면,
- 전위 순회한 결과 : ABDCEFG //
루트( 왼쪽 자식)( 오른쪽 자식)( ) - 중위 순회한 결과 : DBAECFG //
왼쪽 자식( 루트)( 오른쪽 자식)( ) - 후위 순회한 결과 : DBEGFCA //
왼쪽 자식( 오른쪽 자식)( 루트)( )
가 된다.
더보기
입력
첫째 줄에는 이진 트리의 노드의 개수 N
출력
첫째 줄에 전위 순회, 둘째 줄에 중위 순회, 셋째 줄에 후위 순회한 결과를 출력한다. 각 줄에 N개의 알파벳을 공백 없이 출력하면 된다.
전위, 중위, 후위 순회 규칙에 따라 작성한 코드
설명이 조금 더 필요하면, 아래 접은 글에 풀어쓴 코드 참조
from sys import stdin
input = stdin.readline
n = int(input())
graph = {}
for _ in range(n):
p, l, r = input().rstrip().split()
graph[p] = [l, r]
def rec(s):
a, b, c = s, s, ""
for i, t in enumerate(graph[s]):
if t == ".":
continue
x, y, z = rec(t)
if i%2:
a += x
b += y
c += z
else:
a += x
b = y + b
c = z
return a, b, c+s
print("\n".join(rec("A")))
각각 순회마다 함수를 만든 코드
더보기
from sys import stdin
input = stdin.readline
n = int(input())
graph = {}
for _ in range(n):
p, l, r = input().rstrip().split()
graph[p] = [l, r]
# 아래 함수들은 각각의 순회를 나타내며
# 자식의 자식에 대한 순서를 반영하기 위해서 함수를 재귀적으로 호출합니다.
# 전위 순회는 루트 > 왼쪽 자식 > 오른쪽 자식 순서라서
# 연결된 자식을 순서대로 이어 붙이면 된다.
def f(s):
tmp = s
for a in graph[s]:
if a == ".":
continue
tmp += f(a)
return tmp
# 중위 순회는 왼쪽 자식 > 루트 > 오른쪽 자식이라서
# 인덱스로 왼쪽 / 오른쪽을 구분해서 문자열을 이어붙이는 위치를 조정했습니다.
def m(s):
tmp = s
for i, a in enumerate(graph[s]):
if a == ".":
continue
if i%2:
tmp += m(a)
else:
tmp = m(a) + tmp
return tmp
# 후위 순회는 왼쪽 자식 > 오른쪽 자식 > 루트라서
# 빈 문자열에 왼쪽 자식, 오른쪽 자식을 붙인 후 루트를 붙이도록 코드를 짰습니다.
def b(s):
tmp = ""
for i, a in enumerate(graph[s]):
if a == ".":
continue
if i%2:
tmp += b(a)
else:
tmp = b(a)
return tmp + s
print(f("A"), m("A"), b("A"), sep="\n")
더보기
예제 입력 1
7
A B C
B D .
C E F
E . .
F . G
D . .
G . .
예제 출력 1
ABDCEFG
DBAECFG
DBEGFCA
'IT > Python' 카테고리의 다른 글
[백준] 11660번 구간 합 구하기 5 [Python] - 다이나믹, 누적 합 0 | 2023.10.25 |
---|---|
[백준] 11659번 구간 합 구하기 4 [Python] - 누적 합 1 | 2023.10.25 |
[백준] 9465번 스티커 [Python] - 다이나믹 2 | 2023.10.25 |
[백준] 1932번 정수 삼각형 [Python] - 다이나믹 1 | 2023.10.23 |