큐와 트리 구조

고성욱·2023년 3월 17일
0

개발 CS

목록 보기
3/8

큐(Queue)

큐는 선형 자료구조로, 먼저 들어온 데이터가 먼저 나가는(FIFO, First-In-First-Out) 구조를 가지고 있습니다. 큐는 일상생활에서 줄을 서서 기다리는 것과 비슷한 개념입니다. 큐는 데이터를 삽입하는 enqueue와 데이터를 삭제하는 dequeue 연산이 있습니다. 큐는 대기열, 버퍼 등 다양한 용도로 사용됩니다.

큐(Queue)의 장단점

장점

  • 먼저 들어온 데이터가 먼저 처리되는 구조로, 대기열에 사용하기 좋다.
  • 구현이 간단하며, 데이터를 처리하는 속도가 빠르다.

단점

  • 큐의 길이에 제한이 있어 큐가 가득찬 경우 새로운 데이터를 삽입할 수 없다.
  • 큐가 비어있는 경우에는 데이터를 삭제할 수 없다.

큐(Queue)는 대기열, 버퍼 등 다양한 용도로 사용됩니다.

class Queue:
    def __init__(self):
        self.items = []

    def is_empty(self):
        return not bool(self.items)

    def enqueue(self, item):
        self.items.append(item)

    def dequeue(self):
        if not self.is_empty():
            return self.items.pop(0)

    def peek(self):
        if not self.is_empty():
            return self.items[0]

    def __len__(self):
        return len(self.items)

위의 코드는 파이썬으로 구현한 큐(Queue) 자료구조입니다. enqueue 메소드는 큐에 새로운 데이터를 추가하며, dequeue 메소드는 큐에서 가장 먼저 들어온 데이터를 삭제합니다. 또한, peek 메소드는 큐에서 가장 먼저 들어온 데이터를 반환하지만 삭제하지 않습니다. is_empty 메소드는 큐가 비어있는지 확인하며, __len__ 메소드는 큐의 길이를 반환합니다.

트리(Tree)

트리는 비선형 자료구조로 계층적인 구조를 가지고 있습니다. 트리는 하나의 루트 노드에서 시작하여 여러 개의 자식 노드를 가지는 구조이며, 각 자식 노드는 다시 자신의 자식 노드를 가질 수 있습니다. 이러한 구조로 인해 트리는 계층적인 데이터를 표현하기에 용이합니다.

트리는 이진 트리, 이진 탐색 트리, AVL 트리, B-트리 등 다양한 종류가 있으며, 데이터 검색, 삽입, 삭제 등 다양한 용도로 사용됩니다.

트리(Tree)의 장단점

장점

  • 계층적인 데이터를 표현하기에 용이하다.
  • 데이터 검색, 삽입, 삭제 등에 높은 효율성을 보인다.
  • 이진 탐색 트리 등의 변형으로 데이터를 정렬하여 저장할 수 있다.

단점

  • 트리에 데이터가 많을수록 높은 높이를 가지게 되며, 이는 데이터 검색 시 속도 저하를 초래할 수 있다.
  • 트리 구조는 삽입, 삭제 시 구조의 변경이 필요하므로 구현이 복잡할 수 있다.
class Node:
    def __init__(self, data):
        self.left = None
        self.right = None
        self.data = data

class BinaryTree:
    def __init__(self):
        self.root = None

    def add_node(self, data):
        if self.root is None:
            self.root = Node(data)
        else:
            self._add_node(data, self.root)

    def _add_node(self, data, node):
        if data < node.data:
            if node.left is not None:
                self._add_node(data, node.left)
            else:
                node.left = Node(data)
        else:
            if node.right is not None:
                self._add_node(data, node.right)
            else:
                node.right = Node(data)

    def find_node(self, data):
        if self.root is not None:
            return self._find_node(data, self.root)
        else:
            return None

    def _find_node(self, data, node):
        if data == node.data:
            return node
        elif data < node.data and node.left is not None:
            return self._find_node(data, node.left)
        elif data > node.data and node.right is not None:
            return self._find_node(data, node.right)

    def delete_tree(self):
        self.root = None

    def print_tree(self):
        if self.root is not None:
            self._print_tree(self.root)

    def _print_tree(self, node):
        if node is not None:
            self._print_tree(node.left)
            print(str(node.data))
            self._print_tree(node.right)

위의 코드는 이진 트리(Binary Tree) 자료구조를 파이썬으로 구현한 것입니다. add_node 메소드는 이진 트리에 새로운 데이터를 추가하며, find_node 메소드는 이진 트리에서 데이터를 검색합니다. print_tree 메소드는 이진 트리에 저장된 모든 데이터를 출력합니다. delete_tree 메소드는 이진 트리를 삭제하며, root 속성을 None으로 설정하여 이진 트리를 초기화합니다.

profile
안드로이드, 파이썬 개발자

0개의 댓글