문제
이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.
예를 들어 위와 같은 이진 트리가 입력되면,
- 전위 순회한 결과 : ABDCEFG // (루트) (왼쪽 자식) (오른쪽 자식)
- 중위 순회한 결과 : DBAECFG // (왼쪽 자식) (루트) (오른쪽 자식)
- 후위 순회한 결과 : DBEGFCA // (왼쪽 자식) (오른쪽 자식) (루트)
입력
첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파벳 대문자로 매겨지며, 항상 A가 루트 노드가 된다. 자식 노드가 없는 경우에는 .으로 표현한다.
출력
첫째 줄에 전위 순회, 둘째 줄에 중위 순회, 셋째 줄에 후위 순회한 결과를 출력한다. 각 줄에 N개의 알파벳을 공백 없이 출력하면 된다.
예제 입력 복사 1
7
A B C
B D .
C E F
E . .
F . G
D . .
G . .
예제 출력 복사 1
ABDCEFG
DBAECFG
DBEGFCA
문제 해석
이 문제는 이진 트리(binary tree)의 순회(traversal) 방법에 관한 것이다. 주어진 이진 트리에 대해 세 가지 기본적인 순회 방법을 구현하는 것이 과제다.
정답 코드
# 이진 트리의 노드를 표현하는 클래스
class Node:
def __init__(self, data):
self.data = data # 노드의 데이터
self.left = None # 왼쪽 자식 노드
self.right = None # 오른쪽 자식 노드
# 전위 순회 (Root -> Left -> Right)
def preorder(root):
if root:
print(root.data, end='') # 현재 노드의 데이터 출력
preorder(root.left) # 왼쪽 서브트리 순회
preorder(root.right) # 오른쪽 서브트리 순회
# 중위 순회 (Left -> Root -> Right)
def inorder(root):
if root:
inorder(root.left) # 왼쪽 서브트리 순회
print(root.data, end='') # 현재 노드의 데이터 출력
inorder(root.right) # 오른쪽 서브트리 순회
# 후위 순회 (Left -> Right -> Root)
def postorder(root):
if root:
postorder(root.left) # 왼쪽 서브트리 순회
postorder(root.right) # 오른쪽 서브트리 순회
print(root.data, end='') # 현재 노드의 데이터 출력
# 사용자 입력을 바탕으로 이진 트리 구축
def build_tree():
n = int(input()) # 노드의 개수 입력
nodes = {} # 노드들을 저장할 딕셔너리
for _ in range(n):
data, left, right = input().split() # 노드 데이터와 자식 노드 정보 입력
if data not in nodes:
nodes[data] = Node(data) # 새 노드 생성
if left != '.': # '.'은 자식 노드가 없음을 의미
nodes[data].left = Node(left) # 왼쪽 자식 노드 연결
nodes[left] = nodes[data].left
if right != '.':
nodes[data].right = Node(right) # 오른쪽 자식 노드 연결
nodes[right] = nodes[data].right
return nodes['A'] # 루트 노드 반환 (항상 'A'로 가정)
# 메인 실행 부분
if __name__ == "__main__":
root = build_tree() # 트리 구축
# 세 가지 순회 방식으로 트리를 순회하고 결과 출력
preorder(root)
print() # 줄 바꿈
inorder(root)
print() # 줄 바꿈
postorder(root)
print() # 줄 바꿈
정답 코드 작성을 위해 알아야 할 핵심 개념
카테고리 | 핵심 개념 | 설명 |
프로그래밍 기초 | 객체 지향 프로그래밍 (OOP) | - 클래스 정의 (Node 클래스) - 객체 생성 및 속성 접근 |
파이썬 기본 문법 | - 조건문 (if-else) - 반복문 (for 루프) - 함수 정의 및 호출 |
|
입출력 처리 | - input() 함수 사용 - print() 함수와 end 파라미터 |
|
문자열 처리 | - 문자열 분할 (split() 메소드) | |
예외 처리 | - 기본적인 예외 상황 대비 | |
모듈과 네임스페이스 | - if __name__ == "__main__": 사용 | |
자료구조 | 트리 자료구조 | - 이진 트리의 기본 개념 - 노드, 루트, 자식 노드 등 |
파이썬 자료구조 | - 딕셔너리 사용법 - 리스트 사용법 |
|
알고리즘 | 트리 순회 알고리즘 | - 전위 순회 (Preorder) - 중위 순회 (Inorder) - 후위 순회 (Postorder) |
재귀 함수 | - 재귀의 기본 개념 - 재귀 함수의 종료 조건 |
|
컴퓨터 과학 개념 | 그래프 이론 기초 | - 트리가 그래프의 특수한 형태임을 이해 |
시간 복잡도와 공간 복잡도 | - 각 순회 알고리즘의 복잡도 이해 | |
코딩 스킬 | 알고리즘 구현 능력 | - 문제를 단계별로 해석하고 구현 |
코드 구조화 | - 기능별 함수 분리 | |
데이터 구조 선택 | - 적합한 자료구조 선택 능력 |
'알고리즘' 카테고리의 다른 글
[백준] 11047번 동전 0 - Python (1) | 2024.09.30 |
---|---|
[백준] 9251번 LCS - Python (0) | 2024.09.30 |
[백준] 11654번 아스키 코드 - Python3 (0) | 2024.09.07 |
[백준] 15596번 정수 N개의 합 - Python3 (0) | 2024.09.07 |
[백준] 2562번 최댓값 - Python3 (0) | 2024.09.07 |