1. BST.h
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int K;
typedef struct tree_node {
K key;
struct tree_node* left;
struct tree_node* right;
} TreeNode;
typedef struct {
TreeNode* root;
} BST;
void bst_insert(BST* tree, int key);
TreeNode* bst_search(BST* tree, int key);
void bst_delete(BST* tree, int key);
2. BST.c
#include"BST.h"
void bst_insert(BST* tree, int key) {
TreeNode* newNode = calloc(1, sizeof(TreeNode));
newNode->key = key;
TreeNode* parent = NULL;
TreeNode* curr = tree->root;
int cmp;
while (curr) {
cmp = key - curr->key;
if(cmp > 0){
parent = curr;
curr = curr->right;
}else if (cmp < 0) {
parent = curr;
curr = curr->left;
}else {
//已有key值结点
return;
}
}//curr == NULL
if (!parent) {
//说明插入的是根节点
tree->root = newNode;
} else if (cmp > 0) {
parent->right = newNode;
} else {
parent->left = newNode;
}
}
TreeNode* bst_search(BST* tree, int key) {
TreeNode* curr = tree->root;
int cmp;
while (curr) {
cmp = key - curr->key;
if (cmp > 0) {
curr = curr->right;
}
else if (cmp < 0) {
curr = curr->left;
}
else {
//找到key值结点
return curr;
}
}//curr == NULL
return NULL;
}
void bst_delete(BST* tree, int key) {
//遍历二叉树,找到要删除的结点
TreeNode* parent = NULL;
TreeNode* curr = tree->root;
int cmp;
while (curr) {
cmp = key - curr->key;
if (cmp > 0) {
parent = curr;
curr = curr->right;
}
else if (cmp < 0) {
parent = curr;
curr = curr->left;
}
else {
//cmp = 0找到key结点
break;
}
}//curr == NULL || curr != NULL
if (curr == NULL) return;
//先将度为2的情况退化处理
if (curr->left && curr->right) {
//找右子树中最小的结点
TreeNode* minOfParent = curr;
TreeNode* minOfRight = curr->right;
while (minOfRight->left){
minOfParent = minOfRight;
minOfRight = minOfRight->left;
}//minOfRight->left == NULL
//minOfRight即为curr右子树中最小的结点
curr->key = minOfRight->key;
curr = minOfRight;
parent = minOfParent;
}
//现在转化为度为0或1的情况,
//curr指向待操作的结点
TreeNode* child = curr->left ? curr->left : curr->right;
if (curr->key < parent->key) {
//说明删的是parent的左结点
parent->left = child;
} else {
parent->right = child;
}
}
3. main.c
#include"BST.h"
int main(void) {
BST* newBst = calloc(1, sizeof(BST));
bst_insert(newBst, 9);
bst_insert(newBst, 5);
bst_insert(newBst, 42);
bst_insert(newBst, 3);
bst_insert(newBst, 13);
bst_insert(newBst, 57);
bst_delete(newBst, 9);
return 0;
}
4. 测试