이진 탐색 Tree (Binary Search Tree)
이진 탐색 Tree
는 데이터
의 삽입
, 삭제
, 탐색
등이 자주 발생하는 경우에 효율적인 구조이다.
같은 값을 갖는 Node
가 없어야 한다. 왼쪽 Sub Tree에 있는 모든 데이터는 현재 Node의 값보다 작고,
오른쪽 Sub Tree에 있는 모든 Node의 데이터는 현재 Node의 값보다 크다.
데이터의 탐색
Root
에서부터 탐색이 시작되며 Root node
의 데이터가 찾으려는 데이터보다 작으면 오른쪽 Sub Tree를 탐색하고 찾으려는 데이터보다 크면 왼쪽 Subtree를 탐색한다.
데이터 삽입
Binary Search Tree
에서의 데이터 삽입은 탐색을 통해 이루어지며, 탐색에 성공하면 데이터 삽입에 실패한다. (Binary tree는 같은 데이터를 갖는 Node가 없어야 하기 때문)
탐색에 실패할 경우 데이터를 삽입하며, 아래와 같은 과정을 거친다.
- 삽입하려는 데이터가 Root node의 데이터보다 작으면 왼쪽 Subtree로.
- 왼쪽 Subtree의 Root node보다 크면 오른쪽 Subtree로.
- 만약에 단말 Node를 만난다면 더 이상 탐색은 진행하지 않는다.
- 단말 Node보다 작으면 단말 Node의 왼쪽 자식 Node로, 단말 Node보다 크면 단말 Node의 오른쪽 자식 Node로 새 Node를 삽입한다.
데이터 삭제
데이터 삭제는 삭제할 Node의 위치에 따라 세 가지 케이스로 구분된다.
삭제할 Node가 단말 Node일 경우
부모 Node에서 삭제할 Node를 가리키는 링크를 제거하면 된다.
삭제할 Node의 자식 Node가 하나일 경우
부모 Node가 삭제할 Node의 자식 Node를 가리키게 한 후 제거하면 된다.
삭제할 Node의 자식 Node가 두 개일 경우
삭제할 Node를 왼쪽 Sub Tree에서 가장 큰 Node로 대체하거나 오른쪽 Sub Tree에서 가장 작은 Node로 대체한 후 원래 Node를 삭제한다.
이거 이해하는데 시간이 걸렸다. 멍청해 멍청해…
구현
Node는 아래와 같이 꾸미고,
|
|
BST (Binary Search Tree)는 아래와 같이 꾸민다.
|
|
Main에서 Tree 생성 후 실행해보면
|
|
각각 아래와 같은 결과를 얻을 수 있다.
|