Python
[백준] 1991번 : 트리 순회 ☆
Leunco
2022. 1. 9. 23:37
유형 : 트리, 구현
[예시 입력]
7
A B C
B D .
C E F
E . .
F . G
D . .
G . .
[예시 출력]
ABDCEFG
DBAECFG
DBEGFCA
1. 내 풀이
더보기
N = int(input())
value_list = []
key_list = []
for _ in range(N):
tmp = input().split(' ')
key_list.append(tmp[0])
value_list.append(tmp[1:])
graph = dict(zip(key_list,value_list))
start_node = 'A'
visited, need_visit = list(), list()
need_visit.append(start_node)
# 전위 순회
while need_visit:
node = need_visit.pop()
if node not in visited:
if node == '.':
continue
visited.append(node)
need_visit.extend(reversed(graph[node]))
print(visited)
visited, need_visit = list(), list()
need_visit.append(start_node)
▷ 어떻게 구현할 지 몰라서 전위 순회만 했다.
▷ 기본 유형인데.. 반성하자..
2. 다른 풀이
출처 : 패스트캠퍼스 - 알고리즘 / 기술면접 완전 정복 올인원 패키지 Online
** 핵심 아이디어
1. 전위순회 : 루트 → 왼쪽 자식 → 오른쪽 자식
2. 중위순회 : 왼쪽 자식 → 루트 → 오른쪽 자식
3. 후위순회 : 왼쪽 자식 → 오른쪽 자식 → 루트
class Node:
def __init__(self, data, left_node, right_node):
self.data = data
self.left_node = left_node
self.right_node = right_node
# 전위순회
def pre_order(node):
print(node.data, end='')
if node.left_node != '.':
pre_order(tree[node.left_node])
if node.right_node != '.':
pre_order(tree[node.right_node])
# 중위순회
def in_order(node):
if node.left_node != '.':
in_order(tree[node.left_node])
print(node.data, end='')
if node.right_node != '.':
in_order(tree[node.right_node])
# 후위순회
def post_order(node):
if node.left_node != '.':
post_order(tree[node.left_node])
if node.right_node != '.':
post_order(tree[node.right_node])
print(node.data, end='')
n = int(input())
tree = {}
for i in range(n):
data, left_node, right_node = input().split()
tree[data] = Node(data, left_node, right_node)
pre_order(tree['A'])
print()
in_order(tree['A'])
print()
post_order(tree['A'])
문제 출처 : https://www.acmicpc.net/problem/1991
1991번: 트리 순회
첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파
www.acmicpc.net
반응형