이진 트리 기반의 탐색을 위한 자료구조이다.
이진 탐색 트리는 기존 이진트리보다 탐색이 빠르다.
중복값을 허락하지 않는다.
- 루트 노드의 키와 찾고자 하는 값을 비교한다. 찾고자 하는 값이라면 탐색을 종료한다.
- 찾고자 하는 값이 루트 노드의 키보다 작다면 왼쪽 서브 트리로 탐색을 진행한다.
- 찾고자 하는 값이 루트노드의 키보다 크다면 오른쪽 서브트리로 탐색을 진행한다.
위 과정을 찾고자 하는 값을 찾을 때까지 반복해서 진행한다. 만약 그값을 찾지 못하면 그대로 종료한다.
- 삽입할 값을 루트 노드와 비교해서 같다면 오류발생 (중복 값 허용 X)
- 삽입할 값이 루트 노드의 키보다 작다면 왼쪽 서브 트리를 탐색해서 비어있다면 추가하고, 비어있지 않다면 다시 값을 비교한다.
- 삽입할 값이 루트 노드의 키보다 크다면 오른쪽 서브트리를 탐색해서 비어있다면 추가하고, 비어있지 않다면 다시 값을 비교한다.
6의 값을 삽입한다고 가정한다.
탐색과 비슷하게 삽입하고자 하는 값을 계속해서 비교해가며 삽입할 위치를 찾는다.
삽입할 위치가 5의 오른쪽 서브 트리인 것을 찾았으므로, 5의 오른쪽 자식으로 6을 추가하면 된다.
3가지 경우
- 삭제하려는 노드가 단말 노드(leaf node) 일 경우
- 삭제하려는 노드의 서브 트리가 하나인 경우(왼쪽 혹은 오른쪽 서브 트리)
- 삭제하려는 노드의 서브 트리가 두 개인 경우
자식이 없는 단말노드의 삭제는 간단하다. 삭제할 노드의 부모 노드가 있다면 부모 노드의 자식 노드를 NULL로 만들고, 삭제할 노드를 삭제(메모리 해제) 해주면 된다.
삭제하려는 노드의 서브 트리가 하나인 경우도 간단하다. 삭제할 노드의 자식노드를 삭제할 노드의 부모노드가 가리키게 하고 해당 노드를 삭제하면 된다.
삭제하려는 노드의 서브트리가 두 개인 경우는 가장 복잡하다. 이 경우 두 가지 방법을 사용할 수 있다.
위와 같이 삭제할 노드의 왼쪽 서브 트리에서 가장 큰 자손을 해당 노드의 자리에 올리면, 이진 탐색 트리의 조건을 만족하면서 트리가 유지되는 것을 확인할 수 있다. 또한 자리를 옮기면서 다른 노드들(4번노드)도 자리가 적절히 이동한 것을 확인 할 수 있다.
위와 같이 삭제할 노드의 오른쪽 서브 트리에서 가장 작은 자손을 해당 노드의 자리에 올리면, 이진 탐색 트리의 조건을 만족하면서 트리가 유지되는 것을 확인할 수 있다. 또한 자리를 옮기면서 다른 노드들(10번노드)도 자리가 적절히 이동한 것을 확인 할 수 있다.
이진 트리
이다.root Node
root Node
힙 자료구조 : 최대값, 최소값을 빠르게 검색하기 위한 구조
좌 자식노드
< 부모 노드
< 우 자식 노드
이진탐색트리 자료구조 : 특정 트리를 빠르게 탐색하기 위한 구조