自己码算法-二叉搜索树(BST)

二叉搜索树(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删除操作

猜你喜欢

转载自www.cnblogs.com/yhonker/p/12318459.html
今日推荐