[자료구조] 이진 트리(Bianary Tree) - 이진트리의 순회과정

da__ell·2022년 10월 6일
0

DataStructure / ALGORITHM

목록 보기
8/23

이진트리(Binary Tree)는 다음과 같이 root와 edge로 연결된 노드를 의미한다.
이진 트리는 데이터 저장 목적으로 사용되는 자료 구조로. 각 노드가 최대 두 개의 자식을 가질 수 있는 조건을 가지고 있다. 이진 트리는 정렬된 배열과 연결 리스트처럼 검색이 빠르고 삽입 또는 삭제 작업이 연결 리스트에서처럼 빠르기 때문에 해당 이점을 모두 갖고 있다.

bifurcating arborescence라고도 불리는데 한국어로는 두 갈래로 갈라진 나뭇가지라는 의미를 가진다.

자식 노드(child-nord)의 구성에 따라 이진트리의 분류도 나뉜다.
자식노드가 왼쪽부터 위치하면 Complete Binary Tree,
자식노드가 2개 모두 있거나 혹은 아예 없는 경우 Full Binary Tree로 분류한다.

트리의 순회

예시 - 백준 1991번

해당 문제는 이진트리의 순회과정을 코드로 구현하는 문제이다.

import sys
sys.stdin = open('input.txt', 'r')
input = sys.stdin.readline


class Node():

    def __init__(self, item, left, right):
        # item은 본인 (root node가 됨), left, right는 각각 child node가 됨.
        self.item = item
        self.left = left
        self.right = right
# Node 생성 Node는 자기 자신의 값인 item과 child node의 위치인 left와 right를 가짐.


def preorder(node):
    print(node.item, end='')
    if node.left != '.':
        preorder(tree[node.left])
    if node.right != '.':
        preorder(tree[node.right])
    # 전위 순회 root > left child > right child 순으로 순회함.


def inorder(node):
    if node.left != '.':
        inorder(tree[node.left])
    print(node.item, end='')
    if node.right != '.':
        inorder(tree[node.right])
    # 중위 순회 left > root > right 순으로 순회함.


def postorder(node):
    if node.left != '.':
        postorder(tree[node.left])
    if node.right != '.':
        postorder(tree[node.right])
    print(node.item, end='')
    # 후위 순회는 left > right > root 순으로 순회함.


N = int(input())
tree = {}
# 노드를 엮어줄 트리 생성 딕셔너리로 받는 이유
# TypeError: list indices must be integers or slices, not str 때문.

for i in range(N):
    node, left, right = map(str, input().split())
    tree[node] = Node(node, left, right)
# 트리에 입력받은 노드 값 입력
# tree[A] = left, right, root node

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

해당 코드는 각각 전위, 중위, 후위 순회를 구현하였다. 재귀를 활용한 이유는 각 자식 노드들이 또다른 자식 노드들을 갖고 있을 때 다시 해당 노드들까지 탐색하도록 하기 위함이다.

출처)
https://www.youtube.com/watch?v=QN1rZYX6QaA&t=219s
https://www.youtube.com/watch?v=i5yHkP1jQmo

profile
daelkdev@gmail.com

0개의 댓글