본문 바로가기
Baekjoon/트리

[백준] 1991번, 트리 순회 | (python,파이썬)

by 성재심 2021. 7. 28.

문제 링크

 

 

1991번: 트리 순회

첫째 줄에는 이진 트리의 노드의 개수 N(1≤N≤26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 영문자

www.acmicpc.net


문제


문제해결하기

 트리의 순회 ?

 

트리의 순회는 세가지 방법으로 preorder, inorder, postorder가 있다.  (M의 위치 기준으로 이름을 지었다.)

▷Preorder: M L R (Middle 노드 출력 → Left subtree 순회 → Right subtree 순회)
▷Inorder: L M R (Left subtree 순회 → Middle 노드 출력 → Right subtree 순회)
▷Postorder: L R M (Left subtree 순회 → Right subtree 순회 → Middle 노드 출력)

 

그림으로 알아보기

코드는 아주 단순하다. 순회 방식에 따라 재귀호출, 출력의 위치만 설정해주면 된다. 


정답코드

def preorder(k) :
    if k !='.':
        print(k,end='')
        preorder(tree[k][0])
        preorder(tree[k][1])
    
def inorder(k) :
    if k !='.':
        inorder(tree[k][0])
        print(k,end='')
        inorder(tree[k][1])
    

def postorder(k) :
    if k !='.':
        postorder(tree[k][0])
        postorder(tree[k][1])
        print(k,end='')

n = int(input()) 
tree = {} # tree 생성 
for _ in range(n): 
    root, left, right = input().split() 
    tree[root] = (left, right)

preorder('A')
print()
inorder('A')
print()
postorder('A')

▷ 딕셔너리에 대해 익숙하지않아서 문자열 주어진 노드에 대한 정보를 줬을때 항상 헤매는데..

문자열에 대한 정보를 저장할땐 항상 딕셔너리부터 생각해야겠다!


[출처]

신찬수 교수 (한국외국어대학교 컴퓨터 공학부), 'Data Structures with Python', p.95~97

Youtube : ‘Chan-Su Shin’

 

 

Chan-Su Shin

한국외국어대학교 컴퓨터공학부 신찬수 교수의 강의용 채널로 전체 공개 콘텐츠입니다. (죽어가던 채널을 코로나가 강제로 부활시키는군요.) 주로 자료구조와 알고리즘에 대한 내용을 다루며,