happy318
팽도리블로그
happy318
전체 방문자
오늘
어제
  • 전체글 (252)
    • 공부 (5)
      • Algorithm 정리 (0)
      • 논문리뷰 (1)
      • C++ (2)
      • Python (2)
      • Java (0)
      • Back-end (0)
      • Front-end (0)
      • Embedded (0)
    • 코딩테스트 (218)
      • Python 문제풀이 (100)
      • C++ 문제풀이 (108)
      • Python template (9)
      • C++ template (1)
    • 일상 (20)
      • 맛집 (13)
      • 쇼핑 (5)
      • 아무 일상 (2)
    • 게임 (9)
      • 메이플스토리 (9)

최근 글

인기 글

hELLO · Designed By 정상우.
happy318

팽도리블로그

코딩테스트/Python 문제풀이

[백준] 트리 순회

2022. 6. 29. 00:40

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

 

1991번: 트리 순회

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

www.acmicpc.net

트리 자료구조를 구현하고, 알맞게 순회할수 있게 해야하는 문제입니다.

 

우선 문제부터 간단하게 요약하면, 

Tree의 정보가 들어오면, 이 Tree의 Preorder, Inorder, Postorder traversal 결과를 알맞게 return해야 합니다.

 

<Solution>

Node라는 class를 만들어서 이 자료구조를 관리해주는 형태로 진행하면 됩니다. 

class node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

각각의 traversal은 알맞게 재귀함수로 구현하였습니다.

 

실제 구현은 아래와 같습니다. 

import sys
import string
from collections import defaultdict

N = int(sys.stdin.readline().rstrip())

class node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

alphabet_string = string.ascii_uppercase
alphabet_list = list(alphabet_string)

fast_search_dict = defaultdict(int)
for idx, alp in enumerate(alphabet_list):
    fast_search_dict[alp] = idx

nodes = []
# make 26 node and save
for i in range(26):
    node_ = node(alphabet_list[i])
    nodes.append(node_)

for _ in range(N):
    nd, left, right = sys.stdin.readline().rstrip().split()
    node__ = nodes[fast_search_dict[nd]]
    if left != '.':
        node__.left = nodes[fast_search_dict[left]]
    if right != '.':
        node__.right = nodes[fast_search_dict[right]]

def preorder(node, return_list = []):
    if node:
        return_list.append(node.data)
        preorder(node.left, return_list)
        preorder(node.right, return_list)
    
    return return_list

def inorder(node, return_list = []):
    if node:
        inorder(node.left, return_list)
        return_list.append(node.data)
        inorder(node.right, return_list)

    return return_list

def postorder(node, return_list = []):
    if node:
        postorder(node.left, return_list)
        postorder(node.right, return_list)
        return_list.append(node.data)

    return return_list

print(''.join(preorder(nodes[0])))
print(''.join(inorder(nodes[0])))
print(''.join(postorder(nodes[0])))
반응형

'코딩테스트 > Python 문제풀이' 카테고리의 다른 글

[백준] 벽 부수고 이동하기  (0) 2022.06.29
[백준] 내려가기  (0) 2022.06.29
[백준] 트리의 지름  (0) 2022.06.28
[백준] 정수 삼각형  (0) 2022.06.28
[백준] 후위 표기식  (0) 2022.06.28
    '코딩테스트/Python 문제풀이' 카테고리의 다른 글
    • [백준] 벽 부수고 이동하기
    • [백준] 내려가기
    • [백준] 트리의 지름
    • [백준] 정수 삼각형
    happy318
    happy318

    티스토리툴바