思路篇:【核心】左子树都是比根节点小的,右子树都是比根节点大的,为了更高效的查询
代码示例
#include <stdio.h>
#include <malloc.h>
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
}TreeNode;
//二叉搜索树
typedef struct BinarySearchTree {
TreeNode* root;
}BinarySearchTree;
//创建
void BSTCreate(BinarySearchTree* t){
t->root=NULL;
}
//删除一个数
void BSTRemove(BinarySearchTree *t,int val);
//销毁一个树,迭代删除所有的数
void BSTDestroy(BinarySearchTree *t){
while(t->root){
BSTRemove(t,t->root->val);
}
}
//要插入的树
TreeNode* insertNode(BinarySearchTree* t,TreeNode* node,int val){
if(node==NULL){
TreeNode* tn =(TreeNode *)malloc(sizeof (TreeNode));
tn->val=val;
tn->left=NULL;
tn->right=NULL;
return tn;
}
if(val < node->val){
node->left= insertNode(t,node->left,val);
}else if(val > node->val){
node->right=insertNode(t,node->right,val);
}
return node;
}
//外部调用函数
void BSTCInsert(BinarySearchTree *t , int value ){
t->root=insertNode(t,t->root,value);
}
//删除节点
TreeNode * removeNode(BinarySearchTree *t,TreeNode * node,int value){
if(node==NULL){
return NULL;
}
if(value<node->val){
node->left= removeNode(t,node->left,value);
}else if(value>node->val){
node->right= removeNode(t,node->right,value);
}else{
if(node->left==NULL&&node->right==NULL){
free(node);
node=NULL;
return NULL;
}else if(node->left==NULL){
TreeNode * current = node->right;
free(node);
node=current;
return node;
} else if(node->right==NULL){
TreeNode * current = node->left;
free(node);
node=current;
return node;
}else{
// 左子树和右子树都存在
TreeNode * current = node->right;
// 递归找他的左子树,最小值
while (current->left){
current=current->left;
}
node->val=current->val;
node->right= removeNode(t,node->right,current->val);
}
}
return node;
}
//实际外部调用
void BSTRemove(BinarySearchTree *t,int value){
t->root= removeNode(t,t->root,value);
}
//查找
int searchNode(BinarySearchTree *t,TreeNode* node,int value){
if(node==NULL){
return 0;
}
if(value<node->val){
return searchNode(t,node->left,value);
}else if(value>node->val){
return searchNode(t,node->right,value);
}
// 否则就是相等
return 1;
}
//提供给外部调用的函数
int BSTSearch(BinarySearchTree *t,int value){
return searchNode(t,t->root,value);
}
//实现一个中序遍历
void Inorder(BinarySearchTree *t,TreeNode * node){
if(node){
Inorder(t,node->left);
printf("%d",node->val);
Inorder(t,node->right);
}
}
//中序遍历的外部调用函数
void BSTInorder(BinarySearchTree *t){
Inorder(t,t->root);
printf("\n");
}
int main() {
BinarySearchTree bst;
BSTCreate(&bst);
BSTCInsert(&bst,50);
BSTCInsert(&bst,30);
BSTCInsert(&bst,70);
BSTCInsert(&bst,40);
BSTCInsert(&bst,80);
BSTCInsert(&bst,60);
BSTCInsert(&bst,100);
BSTInorder(&bst);
printf("%d\n", BSTSearch(&bst,100));
printf("%d\n", BSTSearch(&bst,110));
BSTRemove(&bst,70);
BSTInorder(&bst);
BSTCInsert(&bst,50);
BSTInorder(&bst);
return 0;
}