제목 날짜 내용 발행일 23.03.15
해당 포스터는 자료구조 학습 내용 중
Binary Search Tree
기초이론에 대한 내용을 정리한 것입니다.
트리 구조는 편리한 구조를 전시하는 것 외에 효율적인 탐색을 위해 사용하기도 한다.
효율적인 탐색을 위해 고민하고 발전시켜 새로운 트리의 모습을 만드는 등 치열한 노력을 쏟아왔다.
그렇기 때문에 트리 구조는 가지고 있는 특징에 따라 여러 가지 이름으로 불린다.
많은 트리의 모습 중, 가장 간단하고 많이 사용하는 이진 트리(binary tree)
와 이진 탐색 트리(binary search tree)
에 대해 정리했다.
이진 트리(Binary tree)는 자식 노드가 최대 두 개인 노드로 구성된 트리
이진 트리는 자료의 삽입, 삭제 방법에 따라 다음과 같이 나뉜다.
이진 트리는 아래와 같은 특징이 있다.
정 이진 트리(Full binary tree) :
0
개 혹은 2
개의 자식 노드를 갖는다.포화 이진 트리(Perfect binary tree) :
정 이진 트리이면서 완전 이진 트리인 경우
모든 리프 노드의 레벨이 동일하고, 모든 레벨이 가득 채워져 있는 트리
완전 이진 트리(Complete binary tree) :
이러한 이진 트리는 이진 탐색 트리와 이진 힙 구현에 사용되며, 효율적인 검색과 정렬을 위해 사용된다.
이진 탐색 트리란?
- 이진 탐색의 속성이 이진 트리에 적용된 특별한 형태의 이진 트리
이진 탐색 알고리즘이란 정렬된 데이터 중에서 특정한 값을 찾기 위한 탐색 알고리즘 중 하나다.
이진 탐색 알고리즘은 오름차순으로 정렬된 정수의 배열을 같은 크기의 두 부분 배열로 나눈 후, 두 부분 중 탐색이 필요한 부분에서만 탐색하도록 탐색 범위를 제한하여 원하는 값을 찾는 알고리즘입니다.
배열의 중간에 내가 찾고자 하는 값이 있는지 확인한다.
중간값이 내가 찾고자 하는 값이 아닐 경우,
찾고자 하는 값이 중간값보다 작은 값일 경우,
찾고자 하는 값이 중간값보다 큰 값일 경우,
이진 탐색 트리는 이러한 이진 탐색의 알고리즘이 이진 트리에 적용된 형태로 트리의 루트노드는 이진 탐색에서 리스트의 중간값이 된다.
루트노드의 왼편 서브 트리의 값들은 이진 탐색 알고리즘에 기반하여 모두 루트노드의 값보다 작은 값들이 자리 잡고 있고 루트노드의 오른편 서브 트리의 값들은 루트노드의 값보다 큰 값들이 자리 잡고 있어야 한다.
정리하자면 다음과 같다.
- 각 노드에 중복되지 않는 키(Key)가 있다.
- 루트노드의 왼쪽 서브 트리는 해당 노드의 키보다 작은 키를 갖는 노드들로 이루어져 있다.
- 루트노드의 오른쪽 서브 트리는 해당 노드의 키보다 큰 키를 갖는 노드들로 이루어져 있다.
- 좌우 서브 트리도 모두 이진 탐색 트리여야 한다.
즉 이진 탐색 트리(Binary Search Tree)는 모든 왼쪽 자식의 값이 루트나 부모보다 작고, 모든 오른쪽 자식의 값이 루트나 부모보다 큰 값을 가지는 특징이 있다.
예를 들어서 다음과 같은 트리가 이진 탐색 트리다.
이진 탐색 트리는 균형 잡힌 트리가 아닐 때, 입력되는 값의 순서에 따라 한쪽으로 노드들이 몰리게 될 수 있다.
균형이 잡히지 않은 트리는 탐색하는 데 시간이 더 걸리는 경우도 있기 때문에 해결해야 할 문제다.
이 문제를 해결하기 위해 삽입과 삭제마다 트리의 구조를 재조정하는 과정을 거치는 알고리즘을 추가할 수 있다.
이진 탐색 트리는 기존 이진 트리보다 탐색이 빠르다
이진 탐색 트리의 연산은 트리의 높이가 h(height)
라면 o(h)
의 복잡도를 가진다.
이와 같은 효율적인 연산이 가능한 이유는 탐색 과정에 있습니다.
이진 탐색 트리의 탐색은 다음과 같은 과정을 거칩니다.
- 루트 노드의 키와 찾고자 하는 값을 비교
- 만약 찾고자 하는 값이라면 탐색을 종료
- 찾고자 하는 값이 루트 노드의 키보다 작다면,
- 왼쪽 서브 트리로 탐색을 진행
- 찾고자 하는 값이 루트 노드의 키보다 크다면,
- 오른쪽 서브 트리로 탐색을 진행
이 과정을 찾고자 하는 값을 찾을 때까지 반복해 진행
만약 값을 찾지 못한다면 그대로 연산을 종료
이러한 탐색 과정을 거치면 최대 트리의 높이(h)만큼 탐색을 진행합니다.
만약 이와 같은 트리에서 5라는 값을 찾고자 하면
제일 처음에는 루트 노드와 값을 비교
루트 노드가 여기서는 10
이므로 루트 노드보다 작기 때문에, 왼쪽 서브 트리로 탐색을 시작
이후 마주친 노드는 7이고, 찾고자 하는 값은 5이므로 다시 7을 기준으로 왼쪽 서브 트리로 탐색을 진행
이어 만난 값이 찾고자 하는 값이므로 탐색이 종료
10부터 5까지 3번의 탐색이 이뤄졌지만, 만약 3을 찾는다면 4번의 연산이 진행되었을 것입이다.
즉 트리 안의 값을 찾는다면 무조건 트리의 높이(h) 이하의 탐색이 이뤄지게 된다.
여기서 하나 알아둬야 할 점은, 트리 안에 찾고자 하는 값이 없더라도 최대 h번(트리의 높이) 만큼의 연산 및 탐색이 진행된다는 것
만일 13
이라는 숫자를 찾는다고 가정하면,
마지막으로 도착하는 노드의 값은 14인데, 여기서 13은 14보다 작으므로 왼쪽 서브 트리로 탐색을 진행
그런데 오른쪽 서브 트리가 없으므로 14에서 탐색이 종료
그렇기 때문에 트리 안에 찾고자 하는 값이 없더라도 최대 h번의 연산 및 탐색이 진행되게 되는 것이다.
코드스테이츠 수업자료