# 문제
백준 1991 트리 순회 파이썬 풀이
# 코드
import sys
from collections import defaultdict
N = int(sys.stdin.readline().strip())
graph = defaultdict(lambda : defaultdict(str))
LEFT = 1
RIGHT = -1
for _ in range(N) :
parent, left, right = sys.stdin.readline().split()
if left != "." :
graph[parent][LEFT] = left
if right != "." :
graph[parent][RIGHT] = right
def left(node) :
return graph[node][LEFT]
def right(node) :
return graph[node][RIGHT]
def preorder(cur) :
l = left(cur)
r = right(cur)
# ----------- #
print(cur,end="")
if l != "" :
preorder(l)
if r != "" :
preorder(r)
def inoredr(cur) :
l = left(cur)
r = right(cur)
# ----------- #
if l != "":
inoredr(l)
print(cur,end="")
if r != "":
inoredr(r)
def postorder(cur) :
l = left(cur)
r = right(cur)
# ----------- #
if l != "":
postorder(l)
if r != "":
postorder(r)
print(cur, end="")
preorder("A")
print()
inoredr("A")
print()
postorder("A")
# 풀이
- 이진 트리를 입력받아 구성해야 하기 때문에 어떠한 식으로 트리를 구성할지, 그에대한 자료구조를 정해야 한다.
- 먼저 전위,중위,후위 수식의 경우 재귀를 사용하여 푸는 문제이기 때문에 이 구조를 이해하고 있어야 한다.
- 부모노드와 부모 노드의 LEFT, RIGHT만을 표현 할 수 있으면 되고, 해당 노드가 존재하지 않는 경우를 생각하면 된다.
- 딕셔너리를 사용하여 풀이가 가능할것 같았고, defaultdict을 두번 사용하여 해결할 수 있다.
- 딕셔너리 안에 또 다시 딕셔너리를 담아야 하기 때문에 아래와 같이 graph를 선언해준다.
graph = defaultdict(lambda : defaultdict(str))
- 정해진 재귀의 방법에 따라 순서대로 방문한다.
'•알고리즘(Algorithm ) > 문제풀이' 카테고리의 다른 글
[백준9465&파이썬] DP를 풀때는 N이 1일때부터 하나씩 늘려가며 경우의 수를 따져보자. (0) | 2023.05.09 |
---|---|
[백준1149&파이썬] DP를 사용할때 확정되는 값에 대한 명확한 근거를 찾자 (1) | 2023.05.08 |
[백준16953&파이썬] BFS를 이용해 1차원 탐색하기 (0) | 2023.05.05 |
[백준2407&파이썬] 조합의 경우의 수를 구할때는 수학 공식을 이용하자 (0) | 2023.05.04 |
[백준5525&파이썬] 문자열을 탐색하는 방법(KMP를 시도했으나 실패..) (1) | 2023.05.03 |