알고리즘 - 이진 탐색 트리(Binary Sesarch Tree)

이진 검색 트리(Binary Search Tree)

이진 검색 트리는 노드를 정렬된 순서로 유지하는 자료구조로서 이진 트리로 이루어져 있으며 아래의 특징을 가지고 있다.

  • 노드의 왼쪽 하위 트리에는 노드의 값보다 작은 값의 노드만 존재
  • 노드의 오른쪽 하위 트리에는 노드의 값보다 큰 값의 노드만 존재
  • 왼쪽과 오른쪽 하위 트리 모두 이진 탐색 트리
  • 중복 노드 없음

왼쪽 하위 트리와 오른쪽 하위 트리의 높이 차가 같은 균형 트리일 경우에는 노드 검색, 삽입, 삭제에 대한 시간 복잡도는 O(log n)이 된다.

구현

# Binary Tree


class NodeBT:
    def __init__(self, value=None, level=1):
        self.value = value
        self.level = level
        self.left = None
        self.right = None

    def _add_next_node(self, value, level_here=2):
        new_node = NodeBT(value, level_here)
        if not self.value:
            self.value = new_node
        elif not self.left:
            self.left = new_node
        elif not self.right:
            self.right = new_node
        else:
            self.left = self.left._add_next_node(value, level_here + 1)
        return self

    def _search_for_node(self, value):
        if self.value == value:
            return self
        else:
            found = None
            if self.left:
                found = self.left._search_for_node(value)
            if self.right:
                found = found or self.right._search_for_node(value)
            return found


class BinaryTree:

    def __init__(self):
        self.root = None

    def add_node(self, value):
        if not self.root:
            self.root = NodeBT(value)
        else:
            self.root._add_next_node(value)
# Binary Search Tree


class NodeBST(NodeBT):

    def __init__(self, value=None, level=1):
        self.value = value
        self.level = level
        self.left = None
        self.right = None

    def _add_next_node(self, value, level_here=2):
        new_node = NodeBST(value, level_here)
        if value > self.value:
            self.right = self.right and self.right._add_next_node(
                value, level_here + 1) or new_node
        elif value < self.value:
            self.left = self.left and self.left._add_next_node(
                value, level_here + 1) or new_node
        else:
            print("중복 노드 허용하지 않음")
        return self

    def _search_for_node(self, value):
        if self.value == value:
            return self
        elif self.left and value < self.value:
            return self.left._search_for_node(value)
        elif self.right and value > self.value:
            return self.right._search_for_node(value)
        else:
            return False


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

    def add_node(self, value):
        if not self.root:
            self.root = NodeBST(value)
        else:
            self.root._add_next_node(value)
참조

파이썬 자료구조와 알고리즘