이진 트리(Binary tree)란 각각의 노드가 최대 두 개의 자식 노드를 가지는 트리 자료 구조를 말한다.
이 두개의 자식 노드는 왼쪽 자식 노드와 오른쪽 자식 노드로 나눌수 있다.
이진 탐색 트리(Binary Search Tree)는 원소가 정렬되어 있다는 특징을 이용해 반씩 쪼개가며 탐색하는 이진 탐색(Binary Search)의 아이디어를 채용한 자료구조이다.
이진 탐색 트리는 모든 왼쪽 자식의 값이 루트나 부모보다 작고, 모든 오른쪽 자식의 값이 루트나 부모보다 큰 값을 가지는 특징이 있다. 즉, 원소가 오름차순으로 정렬되어 있어야 한다.
각 노드에 중복된 키(key)는 없어야 하며, 좌우 서브트리도 모두 이진 탐색 트리여야 한다.
이진 탐색 트리는 균형 잡힌 트리가 아닐 때, 입력되는 값의 순서에 따라 한쪽으로 노드들이 몰리게 될 수 있다. 균형이 잡히지 않은 트리는 탐색하는 데 시간이 더 걸리는 경우도 있기 때문에 이 문제를 해결하기 위해 삽입과 삭제마다 트리의 구조를 재조정하는 과정을 거치는 알고리즘을 추가할 수 있다.
이진 탐색 트리의 탐색 과정
- 루트 노드의 키와 찾고자 하는 값을 비교히여 만약 찾고자 하는 값이라면 탐색을 종료한다.
- 찾고자 하는 값이 루트 노드의 키보다 작다면 왼쪽 서브 트리로 탐색을 진행한다.
- 찾고자 하는 값이 루트 노드의 키보다 크다면 오른쪽 서브 트리로 탐색을 진행한다.
만약 아래와 같은 트리에서 5라는 값을 찾고자 하면 제일 처음에는 루트 노드와 값을 비교하게 된다. 루트 노드가 여기서는 10이므로 루트 노드보다 작기 때문에, 왼쪽 서브 트리로 탐색을 시작한다.
이후 마주친 노드는 7이고, 찾고자 하는 값은 5이므로 다시 7을 기준으로 왼쪽 서브 트리로 탐색을 진행한다. 이어 만난 값이 찾고자 하는 값이므로 탐색이 종료된다. 10부터 5까지 3번의 탐색이 이뤄졌지만, 만약 3을 찾는다면 4번의 연산이 진행되었을 것이다. 즉 트리 안의 값을 찾는다면 무조건 트리의 높이(h) 이하의 탐색이 이뤄지게 된다.
여기서 트리 안에 찾고자 하는 값이 없더라도 최대 h번의 연산 및 탐색이 진행된다는 것이다. 만일 13이라는 숫자를 찾는다면, 마지막으로 도착하는 노드의 값은 14인데, 여기서 13은 14보다 작으므로 왼쪽 서브 트리로 탐색을 진행해야 하지만 오른쪽 서브 트리가 없으므로 14에서 탐색이 종료 되게 된다. 그렇기 때문에 트리 안에 찾고자 하는 값이 없더라도 최대 h번의 연산 및 탐색이 진행되게 되는 것이다.