이진탐색트리(Binary Search Tree, BST)는 이진트리의 일종으로, 다음과 같은 특성을 가진 자료구조입니다:
- 각 노드는 하나의 키(데이터)를 가집니다.
- 각 노드의 왼쪽 서브트리에 있는 모든 노드의 키는 그 노드의 키보다 작습니다.
- 각 노드의 오른쪽 서브트리에 있는 모든 노드의 키는 그 노드의 키보다 큽니다.
- 왼쪽과 오른쪽 서브트리도 이진탐색트리입니다.
- 중복된 키를 허용하지 않습니다.
이진탐색트리의 주요 연산에는 데이터의 삽입, 검색, 삭제 등이 있으며, 각 연산의 평균 시간 복잡도는 (O(\log n))입니다. 그러나 트리가 한쪽으로 치우쳐 성장할 경우 최악의 시간 복잡도는 (O(n))에 이를 수 있습니다.
삽입 연산
새로운 키를 삽입할 때, 트리를 루트에서부터 시작하여 다음과 같은 규칙으로 적절한 위치를 찾아 삽입합니다:
- 삽입하려는 키를 루트 키와 비교합니다.
- 키가 루트 키보다 작으면 왼쪽 서브트리로, 크면 오른쪽 서브트리로 이동합니다.
- 이 과정을 서브트리에서 재귀적으로 반복합니다.
- 삽입할 위치에 도달하면 새 노드를 생성하여 키를 저장합니다.
검색 연산
특정 키를 검색할 때는 루트에서 시작하여 다음과 같은 규칙으로 키를 찾습니다:
- 검색하려는 키를 루트 키와 비교합니다.
- 키가 루트 키와 일치하면 검색 성공입니다.
- 키가 루트 키보다 작으면 왼쪽 서브트리에서 검색을 계속하고, 크면 오른쪽 서브트리에서 검색을 계속합니다.
- 해당 키를 찾거나, 리프 노드에 도달할 때까지 이 과정을 반복합니다.
삭제 연산
노드를 삭제할 때는 세 가지 경우를 고려해야 합니다:
- 리프 노드 삭제: 삭제하려는 노드가 리프 노드인 경우, 단순히 노드를 제거합니다.
- 한 개의 자식을 가진 노드 삭제: 삭제하려는 노드가 한 개의 자식만 가진 경우, 자식 노드를 삭제된 노드의 부모 노드와 연결합니다.
- 두 개의 자식을 가진 노드 삭제: 가장 복잡한 경우로, 삭제하려는 노드의 왼쪽 서브트리에서 가장 큰 값을 가진 노드 또는 오른쪽 서브트리에서 가장 작은 값을 가진 노드를 찾아 삭제하려는 노드의 위치로 옮깁니다. 이를 위해서는 후계자를 찾고, 후계자의 원래 위치에서 삭제 과정을 재귀적으로 수행해야 합니다.
이진탐색트리는 중간 크기의 데이터를 다룰 때 효율적이고, 데이터가 동적으로 변화하는 상황에 적합합니다. 데이터베이스 시스템이나 파일 시스템의 인덱스와 같은 곳에서 사용됩니다.
프로그래밍을 배우는 단계에서 이진탐색트리는 자료구조와 알고리즘의 기본적인 이해를 돕고, 재귀적 사고를 훈련하는 데 도움을 줍니다. BST의 삽입, 검색, 삭제 연산을 구현하는 것은 프로그래밍 기술을 향상시키는 좋은 연습이 됩니다.