본문 바로가기

알고리즘/🥈 실버

백준 1991 트리 순회 파이썬 풀이

728x90

난이도 : 실버1

풀이일 : 02271

https://www.acmicpc.net/problem/1991

 

1991번: 트리 순회

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

www.acmicpc.net


링크로 이동하기 귀찮은 분들을 위한 문제 캡쳐


풀이 코드

def preorder(node):   # 전위 순회 함수
    if node:
        print(alphabet[node-1], end= '')
        preorder(left[node])
        preorder(right[node])

def inorder(node):    # 중위 순회 함수
    if node:
        inorder(left[node])
        print(alphabet[node-1], end= '')
        inorder(right[node])

def postorder(node):  # 후위 순회 함수
    if node:
        postorder(left[node])
        postorder(right[node])
        print(alphabet[node-1], end= '')

# 입력받은 문자열을 인덱스로 활용하기 위해 알파벳 배열 생성
alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

n = int(input())
left = [0] * (n+1)
right = [0] * (n+1)
for i in range(1, n+1):
    p, l, r = list(map(str, input().split()))
    # 입력받은 노드를 인덱스로 활용
    # 왼쪽 자식과 오른쪽 자식이 있으면 각각 저장 
    idx = alphabet.index(p)+1
    try:
        left[idx] = alphabet.index(l)+1
    except:
        pass
    try:
        right[idx] = alphabet.index(r)+1
    except:
        pass

preorder(1)
print()
inorder(1)
print()
postorder(1)

코드 구성

  • 문자열을 인덱스로 활용하고자 알파벳 배열 생성
  • 입력받은 노드를 인덱스로 활용하여 왼쪽, 오른쪽 자식 저장
  • 전위순회, 중위순회, 후위순회 결과 각각 출력
  • 출력 형식을 조건에 맞추기 위해 print문 end='' 추가

느낀점

트리 순회 함수를 연습해보기 좋았던 문제

오늘 알고리즘 문제풀이 실패로 옛날에 풀었던 문제 기록