728x90
📌문제 출처
백준 단계별 문제풀이 : 트리
https://www.acmicpc.net/problem/1991
❓ 문제
📗 풀이 코드
'''
각 탐색 방법에 따라 방문하는 노드 순서를 출력해야한다.
각 방식 별로 루트, 왼쪽 자식, 오른쪽 자식의 순서를 일정하게 모든 노드에서 출력해야하므로
재귀함수를 활용해 탐색을 진행하자.
하나의 루트 노드만 입력하면 모든 방식의 탐색을 진행하도록 하나의 클래스를 만들자.
각 방식별 재귀함수 메소드와 모든 탐색 결과를 포함하여 반환하는 정답 출력 메소드를 생성.
클래스 속성값인 루트 노드로부터 모든 방식으로 탐색하고 결과도 출력할 수 있도록 만들자.
'''
from collections import defaultdict
input = open(0).readline
def solution():
n = int(input()) # 노드 개수
tree = defaultdict(list) # 노드별 왼쪽, 오른쪽 자식
for _ in range(n):
p,l,r = input().split()
tree[p]=[l,r]
# 탐색 방식별 클래스 생성
class travel() : # 탐색 객체 생성
def __init__(self,root): # 생성자로 속성 생성
self.ans = ['','',''] # 전위, 중위, 후위 결과값 담아주는 속성
self.root = root # root 속성 생성
def make_output(self) :
self.preord(self.root)
self.inord(self.root)
self.postord(self.root)
for res in self.ans :
print(res)
def preord(self,node): # 루트/왼쪽/오른쪽
left,right = tree[node]
self.ans[0] += node # 루트 입력
if left != '.' : # 왼쪽 자식이 있다면
self.preord(left)
if right != '.' : # 오른쪽 자식이 있다면
self.preord(right)
def inord(self,node): # 왼쪽/루트/오른쪽
left,right = tree[node]
if left != '.' : # 왼쪽 자식이 있다면
self.inord(left)
self.ans[1] += node # 루트 입력
if right != '.' : # 오른쪽 자식이 있다면
self.inord(right)
def postord(self,node): # 왼쪽/오른쪽/루트
left,right = tree[node]
if left != '.' : # 왼쪽 자식이 있다면
self.postord(left)
if right != '.' : # 오른쪽 자식이 있다면
self.postord(right)
self.ans[2] += node # 루트 입력
search = travel('A') # A를 루트 노드로 하는 travel 인스턴스 생성
search.make_output()
if __name__ == '__main__':
solution()
'파이썬 문제풀이' 카테고리의 다른 글
[백준 파이썬] 1717 집합의 표현 (1) | 2023.12.05 |
---|---|
[백준 파이썬] 5639 이진 검색 트리 (0) | 2023.12.05 |
[백준 파이썬] 1967 트리의 지름 (1) | 2023.12.01 |
[백준 파이썬] 11725 트리의 부모찾기 (1) | 2023.11.29 |
[백준 파이썬] 14002 가장 긴 증가하는 부분 수열 4 (0) | 2023.11.29 |