二叉搜索树(BST)是将二叉树改造成能实现高效算法的数据结构的第一步,是avl树,红黑树的基础。
特征:对于每个节点,左子树都比自己小,右子树都比自己大
一.BST的数据结构
BST节点的数据结构和Bintree一样,因为其是建立在Bintree基础上的。
二.BST的方法
1.BST查找方法Find, Findmin(查找最小), Findmax(查找最大)
Bintree Find(Bintree bst, int e, Bintree& prv){
while(bst){
if(e>bst->val){
prv=bst;//prv记录父节点方便插入,删除操作
bst=bst->right;
}else if(e<bst->val){
prv=bst;
bst=bst->left;
}else
return bst;
}
return NULL;
}//查找节点
Bintree Findmin(Bintree bst){
if(bst){
while(bst->left){
bst=bst->left;
}
}
return bst;
}//查找最小元素
Bintree Findmax(Bintree bst){
if(bst){
while(bst->right){
bst=bst->right;
}
}
return bst;
}//查找最大元素
2.BST插入算法BST_Insert
BST BST_Insert(BST bst, int e){//返回被插入节点
if(!bst){
return Node_create(e,NULL);
}//空树插入根节点直接返回
BST prv=NULL;
BST res=Find(bst,e,prv);
if(res){
printf("already exist!\n");
return res;
}//节点已存在,直接返回
//节点不存在,开始插入
BST child=Node_create(e,prv);//创建孩子节点
e<prv->val?prv->left=child:prv->right=child;//插入节点
UpdateHeightAbove(child);
return child;//返回插入节点
}//BST插入操作
3.删除操作BST_Delete
BST BST_Delete(BST& bst, int e, BST& prv){//返回被删除节点的替代节点
//BST prv=NULL;
BST res=Find(bst,e,prv);
if(!res){
return bst;
}
if(res->left&&res->right){//待删除节点左右子树都存在
BST min=Findmin(res->right);
res->val=min->val;
BST p;
BST_Delete(res->right,min->val,p);//第归删除已交换节点
}else{
if(res->left){//只有左子树
res->val=res->left->val;
free(res->left);
res->left=NULL;
}else if(res->right){//只有右子树
res->val=res->right->val;
free(res->right);
res->right=NULL;
}else{//没有子树
if(!prv){
free(bst);
bst=NULL;
}
else if(IsLChild(res)){
free(prv->left);
prv->left=NULL;
}else{
free(prv->right);
prv->right=NULL;
}
return NULL;//无子树节点被删除后替代它的是NULL
}
UpdateHeightAbove(prv);
}
return res;//有子树节点被删除后替代他的是子树节点
}//BST删除操作