백준 1991번 : 트리 순회

2022. 1. 12. 00:35·알고리즘

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

 

1991번: 트리 순회

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

www.acmicpc.net

 

이진 트리에서 전위, 중위, 후위순회를 코드로 구현하는 문제이다.

각 순회는 자식을 가진 특정 노드에서, 부모 노드가 방문되는 순서에 따른 분류이다.

전위 순회 : 부모 노드를 가장 먼저 방문하고 왼쪽 자식, 오른쪽 자식 순서대로 방문한다. (parent → left → right)

중위 순회 : 왼쪽 자식을 먼저 방문하고 부모 노드, 오른쪽 자식 순서대로 방문한다. (left → parent → right)

후위 순회 : 왼쪽 자식, 오른쪽 자식을 순서대로 방문하고 마지막에 부모 노드를 방문한다. (left → right → parent)

 

Node 객체를 만들어서 프로퍼티로 부모와 왼쪽, 오른쪽 자식 노드의 이름을 갖도록 해준다. 각 순회의 종류별로 재귀를 통해 노드를 방문할 때마다 방문한 노드의 이름을 출력하도록 함수를 구현한다. 마지막으로, 노드의 이름을 Key로 하고 Node 객체를 Value로 갖는 사전 객체를 만들어주어 입력이 주어질 때 마다 각 노드의 부모, 자식관계를 설정해준 뒤 루트 노드(A)부터 순회를 진행하면 된다.

class Node:
    def __init__(self, root, left_node, right_node):
        self.root = root
        self.left_node = left_node
        self.right_node = right_node


def preorder(node):
    print(node.root, end='')
    if node.left_node != None:
        preorder(t[node.left_node])
    if node.right_node != None:
        preorder(t[node.right_node])


def inorder(node):
    if node.left_node != None:
        inorder(t[node.left_node])
    print(node.root, end='')
    if node.right_node != None:
        inorder(t[node.right_node])

def postorder(node):
    if node.left_node != None:
        postorder(t[node.left_node])
    if node.right_node != None:
        postorder(t[node.right_node])
    print(node.root, end='')

t = {}
for _ in range(int(input())):
    root, left, right = input().split()
    if left == '.':
        left = None
    if right == '.':
        right = None
    t[root] = Node(root, left, right)

preorder(t['A'])
print()
inorder(t['A'])
print()
postorder(t['A'])

 

저작자표시 (새창열림)

'알고리즘' 카테고리의 다른 글

백준 1766번 : 문제집  (0) 2022.01.12
백준 4195번 : 친구 네트워크  (0) 2022.01.12
백준 1715번 : 카드 정렬하기  (0) 2022.01.12
백준 22871번 : 징검다리(large)  (0) 2021.11.11
백준 3079번 : 입국심사  (0) 2021.11.10
'알고리즘' 카테고리의 다른 글
  • 백준 1766번 : 문제집
  • 백준 4195번 : 친구 네트워크
  • 백준 1715번 : 카드 정렬하기
  • 백준 22871번 : 징검다리(large)
무슈후슈
무슈후슈
코딩은 창작이다.
  • 무슈후슈
    감성코드
    무슈후슈
  • 전체
    오늘
    어제
    • 분류 전체보기 (122)
      • 알고리즘 (30)
      • IOS (27)
      • Swift (4)
      • TIL (41)
      • CS (15)
      • 메모 (2)
      • 시플 (1)
      • RxSwift (2)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    python
    파이썬
    이분 탐색
    그래프 탐색
    프로그래머스
    SWIFT
    MVVM
    코딩테스트
    ios
    백준
    풀이
    알고리즘
    git
    비동기
    다이나믹 프로그래밍
    github
    그리디
    codable
    Realm
    http
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
무슈후슈
백준 1991번 : 트리 순회
상단으로

티스토리툴바