삭제할 노드의 자식이 없는 경우 단순히 제거
삭제할 노드의 자식이 하나만 존재하는 경우 삭제할 노드의 자리에 자식 노드 대체
자식이 둘 다 존재할 경우 그 다음으로 삭제할 노드의 자리에 자기 다음으로 큰 노드 대체
#include <stdio.h>
#include <stdlib.h>
// 노드 구현
typedef struct {
int data;
struct Node* leftChild;
struct Node* rightChild;
} Node;
// 이진 탐색 트리의 삽입
Node* insertNode(Node* root, int data) {
if (root == NULL) {
root = (Node*)malloc(sizeof(Node));
root->leftChild = root->rightChild = NULL;
root->data = data;
return root;
}
else {
if (root->data > data) {
root->leftChild = insertNode(root->leftChild, data);
}
else {
root->rightChild = insertNode(root->rightChild, data);
}
}
return root;
}
// 이진 탐색 트리의 탐색
Node* searchNode(Node* root, int data) {
if(root == NULL) return NULL;
if (root->data == data) return root;
else if (root->data > data) return searchNode(root->leftChild, data);
else return searchNode(root->rightChild, data);
}
// 이진 탐색 트리의 전위순회
void preorder(Node* root) {
if (root == NULL) return;
printf("%d ", root->data);
preorder(root->leftChild);
preorder(root->rightChild);
}
// 이진 탐색 트리의 가장 작은 원소 찾기
Node* findMinNode(Node* root) {
Node* node = root;
while (node->leftChild != NULL) {
node = node->leftChild;
}
return node;
}
// 이진 탐색 트리의 삭제 함수
Node* deleteNode(Node* root, int data) {
Node* node = NULL;
if (root == NULL) return NULL;
if (root->data > data) root->leftChild = deleteNode(root->leftChild, data);
else if (root->data < data) root->rightChild = deleteNode(root->rightChild, data);
else {
// 두 자식 모두 존재 시
if (root->leftChild != NULL && root->rightChild != NULL) {
node = findMinNode(root->rightChild);
root->data = node->data;
root->rightChild = deleteNode(root->rightChild, node->data);
}
// 이외에 삼항 연산자로 처리
else {
node = (root->leftChild != NULL) ? root->leftChild : root->rightChild;
free(root);
return node;
}
}
return root;
}
// 이진 탐색 트리 활용
int main(void) {
Node* root = NULL;
root = insertNode(root, 30);
root = insertNode(root, 17);
root = insertNode(root, 48);
root = insertNode(root, 5);
root = insertNode(root, 23);
root = insertNode(root, 37);
root = insertNode(root, 50);
root = deleteNode(root, 30);
preorder(root);
system("pause");
return 0;
}
위와 같이 서브 트리도 완전 이진 트리가 되도록 이진 탐색 트리를 설계