이진탐색트리
2023. 1. 3. 16:49ㆍ자료구조
이진트리 탐색 시에 원활하게 하는 방식이 더 있는데
root를 기준으로 왼쪽은 root보다 작은 값들을, 오른쪽은 root보다 큰 값들이 오게 하는 것이다.
그래서 찾는 값을 봤을 때 root보다 크면 오른쪽에서 작으면 왼쪽에서만 찾게되어 더 빠르게 찾을 수 있게 된다.
function binarySearch(int n)
{
node_t node = binarySearch.root; // root를 가져온다
while(node != NULL && node.data != n){
if(node.data > n) node = node.left;
else node = node.right;
}
if(node == NULL) fprintf(stderr, "error");
return node;
}
이진탐색트리 삽입
삽입 시에도 이런 규칙을 지켜야하기 때문에
case를 나누어서 삽입을 하게 된다.
- 트리에 노드가 전혀 없는 경우 -> 부모 노드가 null 이므로 이진탐색트리의 root를 node(x) 즉, 넣으려는 노드로 한다.
- 트리에 노드가 있지만 부모에 적혀있는 노드 값보다 삽입하려는 값이 큰 경우 -> 부모노드의 오른쪽으로 가줘야한다.
- 트리에 노드가 있지만 부모에 적혀있는 노드 값보다 삽입하려는 값이 작은 경우 -> 부모노드의 왼쪽으로 가줘야한다.
이 방식을 탐색 노드가 null이 나올때까지 간 후에 null이 나오게 되면 삽입한다.
void binaryTreeInsert(node_t n)
{
node_t node = binarySearch.root; // 탐색 노드
node_t parent = binarySearch.root; // 값을 비교할 부모 노드
while(node != NULL){
parent = node;
if(parent.data > n.data){
node = node.left;
} else {
node = node.right;
}
}
if(parent == NULL){
binarySearch.root = n;
} else if(parent.data > n.data){
parent.left = n;
} else {
parent.right = n;
}
}
이진탐색트리의 삭제
- 값을 찾았을 때 어떻게 처리해줘야하는지가 관건이다.
- 값을 찾았을 때, 왼쪽 노드가 비어있다면 오른쪽 노드를 위로 올려준다.
- 값을 찾았을 때, 오른쪽 노드가 비어있다면 왼쪽 노드를 위로 올려준다.
- 값을 찾았을 때, 왼쪽 오른쪽 모두 차 있다면 -> successor를 찾아주어야 한다. successor은 현재 노드 기준으로 더 크면서 가장 작은 값이다. 찾은 값이 지워질 것이기 때문에 이진탐색트리 successor은 이진탐색트리 규칙에 맞게 해당 자리에 들어 갔어도 왼쪽 값보다는 크고 오른쪽 값보다는 작아야한다.
node_t BinarySearch(int n)
{
node_t node = binarySearchTree.root;
while(node != NULL && node.data != n){
if(node.data > n){
node = node.left;
} else {
node = node.right;
}
}
return node;
}
node_t binarySearchTreeMinimum(node_t tree)
{
node_t node = tree;
while(node.left != NULL){
node = node.left;
}
return node;
}
node_t delete(node_t n)
{
note_t node = BinarySearch(n.data);
if(node.left == NULL){
node = node.right;
} else if(node.right == NULL){
node = node.left;
} else {
node_t successor = binarySearchTreeMinimum(node.right);
if(node.right == successor){
node = successor;
} else {
node.data = successor.data;
successor = successor.right; // successor 은 오른쪽 노드에서 가장 작은 값이므로 왼쪽 자식이 없다
}
}
'자료구조' 카테고리의 다른 글
union-find (0) | 2023.05.11 |
---|---|
그래프 (0) | 2023.01.09 |
트리 구조 (0) | 2023.01.03 |