이진 탐색 트리 (BST, Binary Search Tree)
이진 탐색 트리 코드
#include <stdio.h>
#include <stdlib.h>
typedef char data;
typedef struct _Node {
char key;
struct _Node* left;
struct _Node* right;
}Node;
Node* searchBST(Node* root, char x) {
Node* p = NULL;
p = root;
while (p != NULL) {
if (p->key == x) {
return p;
}
else if (p->key < x) {
p = p->right;
}
else {
p = p->left;
}
}
printf("찾는 키가 존재하지 않습니다.\n");
return NULL;
}
Node* insertBST(Node* root, char x) {
Node* p = root;
Node* parent = NULL;
while (p != NULL) {
parent = p;
if (p->key == x) {
printf("같은 키가 존재합니다.\n");
return p;
}
else if (p->key < x) {
p = p->right;
}
else {
p = p->left;
}
}
// 새 노드 할당
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->key = x;
newNode->left = NULL;
newNode->right = NULL;
// parent의 자식으로 새 노드 붙이기
if (parent != NULL) {
if (parent->key < newNode->key) {
parent->right = newNode;
}
else {
parent->left = newNode;
}
}
return newNode;
}
Node* deleteBST(Node* root, char x) {
Node* p = root;
Node* parent = NULL;
while ((p != NULL) && (p->key != x)) {
parent = p;
if (p->key < x) {
p = p->right;
}
else {
p = p->left;
}
}
if (p == NULL) {
printf("찾는 노드가 존재하지 않습니다.\n");
return root;
}
// 차수가 0인 경우
if (p->left == NULL && p->right == NULL) {
if (parent != NULL) {
if (parent->left == p) {
parent->left = NULL;
}
else {
parent->right = NULL;
}
}
else root = NULL;
}
// 차수가 1인 경우
else if (p->left == NULL || p->right == NULL) {
Node* child = NULL;
if (p->left != NULL) {
child = p->left;
}
else {
child = p->right;
}
if (parent != NULL) {
if (parent->left == p) {
parent->left = child;
}
else {
parent->right = child;
}
}
else root = child;
}
// 차수가 2인 경우
else {
Node* succ_parent = p;
Node* succ = p->right;
while (succ->left != NULL) { // 오른쪽 서브 트리에서 후계자 찾기
succ_parent = succ;
succ = succ->left;
}
if (succ_parent->left == succ) {
succ_parent->left = succ->right;
}
else {
succ_parent->right = succ->right;
}
p->key = succ->key;
p = succ;
}
free(p);
}
void inorder(Node* root) {
if (root == NULL) {
return;
}
else {
inorder(root->left);
printf("%c ", root->key);
inorder(root->right);
}
}
int main() {
Node* root = insertBST(NULL, 'D');
insertBST(root, 'I');
insertBST(root, 'F');
insertBST(root, 'A');
insertBST(root, 'G');
insertBST(root, 'C');
inorder(root); printf("\n");
deleteBST(root, 'C');
inorder(root); printf("\n");
return 0;
}