查找概论2-二叉排序树

2014-08-08  本文已影响47人  eesly_yuan

既要使插入、删除的效率高也要使查找的效率高,即实现高效率的动态查找表——引入二叉排序树

二叉排序树


struct BNode
{
    int data;
    BNode *lhs,*rhs;
};
//二叉排序树搜索
bool searchBST(BNode *T,int key, BNode *pT,BNode *p)
{
    if(!T)
    {
        p = pT;
        return false;
    }
    else if(key == T->data)
    {
        p = T;
        return true;
    }
    else if(key<T->data)
        return(T->lhs,key,T,p);
    else if(key>T->data)
        return(T->rhs,key,T,p);
}
//插入
bool insertBST(BNode *T,int key)
{
    BNode *p;
    if(!searchBST(T,key,NULL,p))
    {
        BNode * s = new BNode();
        s->data = key;
        s->lhs = NULL;
        s->rhs = NULL;
        if(!p)                            //表明为根节点
            p = s;
        if(key>p->data)           
            p->rhs = s;
        else
            p->lhs = s;
        return true;
    }
    else
        return false;
}
//建立一个二叉树
#include <ctime>
void createBTree(BNode * head)
{
    srand(time(NULL));
    int num = 10;
    while (num--)
        insertBST(head,rand()%100);
}

1、删除节点为叶子节点,直接删除即可
2、删除节点只包含左子树或者只包含右子树,这时候将其子树续接后删除该节点即可
3、删除节点包含左、右子树,考虑用里该节点最近的节点进行替换,替换后删除替换的那个节点即可

//删除二叉排序树的节点,采用递归的思想,和采用查找的时候一样
//分为叶子节点——直接删除即可
//删除节点只有左子树或者右子树——删除后把其子树替代原先的节点位置
//删除节点有两个子树
bool deleteNode(BNode *T)
{
    if(T->lhs == NULL  && T->rhs == NULL)   //叶子节点
    {
        delete(T);
    }else if(T->lhs == NULL)                //只有右子树
    {
        BNode *q = T;
        T->data = T->rhs->data;
        T->lhs = T->rhs->lhs;
        T->rhs = T->rhs->rhs;
        delete(T->rhs);
    }else if(T->rhs == NULL)                //只有左子树
    {
        BNode *q = T;
        T->data = T->rhs->data;
        T->rhs = T->lhs->rhs;
        T->lhs = T->lhs->lhs;
        delete(T->lhs);
    }else                                   //有左右子树
    {
        BNode *q = T->lhs;
        BNode *p = T;
        while(q->rhs)
        {
            p = q;
            q = q->rhs;
        }
        T->data = q->data;
        if(q==p->lhs)
            T->lhs = q->lhs;
        else
            p->rhs = q->lhs;
        delete(q);
    }
    return true;
}
bool deleteBST(BNode *T,int key)
{
    if(T == NULL)
        return false;
    if(T->data<key)
        deleteBST(T->rhs,key);
    else if(T->data>key)
        deleteBST(T->lhs,key);
    else
        return deleteNode(T);
}

小结


reference


上一篇 下一篇

猜你喜欢

热点阅读