Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- DFS
- 백준 21606번
- 동적 프로그래밍(Dynamic Programming)
- BFS(Breadth First Search)
- 위상 정렬(Topological Sort)
- 플로이드 워셜 알고리즘(Floyd-Warshall Algorithm)
- 큐(Queue)
- 분할 정복(Divide and Conquer)
- 백준 9012번
- 백준 2504번
- 백준 1948번
- BFS
- 위상 정렬(Topology Sort)
- 이분 탐색(Binary Search)
- 트리(Tree)
- 백준 17608번
- 알고리즘 개념
- 백준 18352번
- 백준 10000번
- 백준 1707번
- 백준 2812번
- 백준 2493번
- 다익스트라 알고리즘(Dijkstra Algorithm)
- 백준 2261번
- DFS(Depth First Search)
- 그리디 알고리즘(Greedy Algorithm)
- 이분 그래프(Bipartite Graph)
- 스택(Stack)
- 그래프(Graph)
- DFS & BFS
Archives
- Today
- Total
Always Be Wise
트리 : 트리 순회(백준 1991번) 본문
728x90
▶ 문제 : https://www.acmicpc.net/problem/1991
1991번: 트리 순회
첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파
www.acmicpc.net
##### 문제 #####
# 이진 트리를 입력받아
# 전위 순회(preorder traversal),
# 중위 순회(inorder traversal),
# 후위 순회(postorder traversal)
# 결과를 출력하는 프로그램을 작성하시오.
##### 입력 #####
# 첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다.
# 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다.
# 노드의 이름은 A부터 차례대로 알파벳 대문자로 매겨지며,
# 항상 A가 루트 노드가 된다. 자식 노드가 없는 경우에는 .으로 표현한다.
##### 출력 #####
# 첫째 줄에 전위 순회, 둘째 줄에 중위 순회, 셋째 줄에 후위 순회한 결과를 출력한다.
# 각 줄에 N개의 알파벳을 공백 없이 출력하면 된다.
▶ 접근 방법
우선, 문제에도 간단히 나와있지만 트리 순회와 관련한 개념을 이해할 필요가 있었다.
트리 순회에 대해서는 아래 관련 링크 중 BFS에 정리해두었다.
문제 해결을 위해서 가장 먼저 트리의 노드 클래스를 만들었다.
그리고 주어진 입력 값과 해당 노드 클래스를 이용하여 개별 노드들을 생성하였다.
이때 개별 노드들은 딕셔너리에 담아주었다.
이후, 전위-중위-후위 순회에 해당하는 함수들을 각각 만들었다.
이때 개별 함수 내부는 순회 별 특징에 맞추어 재귀 함수로 구현하였다.
▶ 풀이 코드
import sys
class Node :
def __init__(self, value, left, right):
self.value = value
self.left = left
self.right = right
tree = {}
for _ in range(int(input())):
value, left, right = list(sys.stdin.readline().split())
tree[value] = Node(value, left, right)
# for i in tree :
# print(f'tree_{i}의 left는 {tree[i].left}, right는 {tree[i].right} ')
def pre_order(node):
print(node.value, end='')
if node.left != '.':
pre_order(tree[node.left])
if node.right != '.':
pre_order(tree[node.right])
def in_order(node):
if node.left != '.':
in_order(tree[node.left])
print(node.value, end='')
if node.right != '.':
in_order(tree[node.right])
def post_order(node):
if node.left != '.':
post_order(tree[node.left])
if node.right != '.':
post_order(tree[node.right])
print(node.value, end='')
pre_order(tree['A'])
print()
in_order(tree['A'])
print()
post_order(tree['A'])
▶ 관련 링크
2021.11.18 - [알고리즘] - 트리(Tree)란?
2021.11.18 - [알고리즘] - BFS(Breadth First Search, 너비 우선 검색)이란?
2021.11.18 - [알고리즘] - DFS(Depth First Search, 깊이 우선 탐색)이란?
2021.11.19 - [알고리즘] - 그래프(Graph)란?
'알고리즘 > 백준' 카테고리의 다른 글
트리 : 최소 스패닝 트리(백준 1197번) (0) | 2021.11.19 |
---|---|
트리 : 이진 검색 트리(백준 5639번) (0) | 2021.11.19 |
큐 : 뱀(백준 3190번) (0) | 2021.11.18 |
큐 : 요세푸스 문제 0(백준 11866번) (0) | 2021.11.18 |
큐 : 카드2(백준 2164번) (0) | 2021.11.18 |
Comments