二叉查找树(BST)

一、简介

        二叉查找树(Binary Search Tree)是指一棵空树或者具有下列性质的二叉树:

  • 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
  • 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
  • 任意节点的左、右子树也分别为二叉查找树;
  • 没有键值相等的节点。

        二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低为 O ( log ⁡ n ) 。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、多重集、关联数组等。

         二叉查找树是能够高效地进行如下操作的数据结构。

  • 插入一个数值
  • 查询是否包含某个数值
  • 删除某个数值

        二叉查找树满足以下条件:

  • 若任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值。
  • 若任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值。
  • 任意结点的左、右子树也分别为二叉搜索树。

二、代码实现

声明

typedef struct BSTNode{
    int data;
    BSTNode *lchild,*rchild;
}BSTNode,*BSTree;

查询

        若二叉查找树为空,则查找失败,返回空指针
        若二叉查找树非空,则将待查找关键字key与根节点的关键字 T − > d a t a T->data T−>data进行比较:
        如果x=T−> data x=T->data x=T−>data,则查找成功,返回查询到的当前节点T
        如果x<T-> data x<T->data x<T−>data,则递归查找左子树
        如果x>T−> data x>T->data x>T−>data,则递归查找右子树

BSTree find(BSTree T,int key)
{
    if(!T||T->data==key)
    {
        return T;
    }
    else if(key<T->data)
    {
        return find(T->lchild,key);
    }
    else
    {
        return find(T->rchild,key);
    }
}

插入

void insert(BSTree &T,int e)
{
    if(!T)
    {
        BSTree S=new BSTNode;
        S->data=e;
        S->lchild=S->rchild=NULL;
        T=S;
    }
    else if(e<T->data)
    {
        insert(T->lchild,e);
    }
    else if(e>T->data)
    {
        insert(T->rchild,e);
    }
}

创建

        二叉查找树的创建可以从空树开始,按照输入关键字的顺序依次进行插入操作,最终得到一棵二叉查找树。 

void build(BSTree &T)
{
    T=NULL;
    int e;
    while(cin>>e,e!=-1)
    {
        insert(T,e);
    }
}

删除

void del(BSTree &T,int key)
{
    BSTree p=T;
    BSTree f=NULL;
    BSTree q,s;
    if(!T)
    {
        return;
    }
    while(p)
    {
        if(p->data==key)
        {
            break;
        }
        f=p;
        if (p->data>key)
        {
            p=p->lchild;
        }
        else
        {
            p=p->rchild;
        }
    }
    if(!p)
    {
        return;
    }
    if((p->lchild)&&(p->rchild))
    {
        q=p;
        s=p->lchild;
        while(s->rchild)
        {
            q=s;
            s=s->rchild;
        }
        p->data=s->data;
        if(q!=p)
        {
            q->rchild=s->lchild;
        }
        else
        {
            q->lchild=s->lchild;
        }
        delete s;
    }
    else
    {
        if(!p->rchild)
        {
            q=p;
            p=p->lchild;
        }
        else if(!p->lchild)
        {
            q=p;
            p=p->rchild;
        }
        if(!f)
        {
            T=p;
        }
        else if(q==f->lchild)
        {
            f->lchild=p;
        }
        else
        {
            f->rchild=p;
        }
        delete q;
    }
}

以上就是本文的全部内容啦!感谢阅读!

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值