Topic

이진 탐색 트리(Binary Search Tree, BST)

JackerLab 2025. 3. 29. 23:13
728x90
반응형

개요

이진 탐색 트리(BST, Binary Search Tree)는 이진 트리의 일종으로, 왼쪽 서브트리에는 루트보다 작은 값이, 오른쪽 서브트리에는 루트보다 큰 값이 저장되는 자료구조이다. 중복 없는 정렬된 데이터를 저장하면서 빠르게 탐색, 삽입, 삭제가 가능하며, 평균적으로 O(log n)의 성능을 보인다. 알고리즘 문제풀이와 데이터베이스, 메모리 관리 등 다양한 분야에 활용된다.


1. BST의 구조와 특징

구성 요소 설명
루트(Root) 트리의 최상위 노드
노드(Node) 데이터와 자식 포인터를 포함한 단위
왼쪽 자식 루트보다 작은 값
오른쪽 자식 루트보다 큰 값

BST는 모든 노드에 대해 왼쪽 < 루트 < 오른쪽이 성립한다.


2. BST의 연산 동작 원리

연산 동작 방식 시간 복잡도 (평균/최악)
탐색(Search) 루트부터 값 비교, 작으면 왼쪽, 크면 오른쪽으로 이동 O(log n) / O(n)
삽입(Insert) 비어있는 위치를 찾아 새 노드 추가 O(log n) / O(n)
삭제(Delete) 0, 1, 2개의 자식을 가진 경우로 나누어 처리 O(log n) / O(n)

최악의 경우는 편향 트리(선형 구조)일 때 발생한다.


3. 파이썬 BST 구현 예시 (삽입 및 중위 순회)

class Node:
    def __init__(self, key):
        self.key = key
        self.left = None
        self.right = None

def insert(root, key):
    if root is None:
        return Node(key)
    if key < root.key:
        root.left = insert(root.left, key)
    else:
        root.right = insert(root.right, key)
    return root

def inorder(node):
    if node:
        inorder(node.left)
        print(node.key, end=' ')
        inorder(node.right)

# 사용 예시
root = None
for k in [50, 30, 70, 20, 40, 60, 80]:
    root = insert(root, k)
inorder(root)  # 출력: 20 30 40 50 60 70 80

4. BST의 장점과 단점

구분 장점 단점
탐색 성능 평균 O(log n) 탐색 가능 편향될 경우 O(n)까지 성능 저하
정렬 출력 중위 순회 시 오름차순 정렬 트리 균형 유지 필요
구현 난이도 재귀적으로 구현하기 직관적 삭제 연산 구현이 복잡할 수 있음

5. 균형 이진 탐색 트리와 비교

트리 유형 설명 균형 유지 성능
일반 BST 삽입 순서에 따라 편향 가능 X O(log n) ~ O(n)
AVL 트리 균형 인수(Balance Factor) 유지 O O(log n)
Red-Black 트리 색상 기반 균형 유지 O O(log n)

6. 활용 분야

분야 활용 예시
정렬된 데이터 저장 오름차순/내림차순 출력
탐색 기반 문제 검색, 삽입, 삭제 반복 문제
중위 순회 출력 정렬 결과 얻기
알고리즘 문제풀이 K번째 수, 트리의 높이, 범위 탐색 등

7. 결론

이진 탐색 트리는 정렬된 데이터를 트리 구조로 효율적으로 저장하고 탐색할 수 있는 자료구조다. 탐색, 삽입, 삭제 모두 평균 O(log n)의 성능을 보이지만, 편향된 트리가 되지 않도록 균형 유지가 중요하다. 중위 순회를 활용한 정렬 출력, 반복적 탐색 문제 해결에 매우 유용하며, 고급 트리 구조인 AVL, Red-Black Tree의 기초가 되는 개념이다.

728x90
반응형

'Topic' 카테고리의 다른 글

해시 테이블(Hash Table)  (1) 2025.03.30
힙(Heap)  (0) 2025.03.30
이진 트리(Binary Tree)  (0) 2025.03.29
트리(Tree)  (0) 2025.03.29
덱(Deque, Double-Ended Queue)  (0) 2025.03.29