数据结构_8:查找:二叉排序树

二叉排序树

  • 数据结构
typedef struct BiTNode //结点结构
{
  int data;  //结点数据
  struct BiTNode *lchild,*rchild; // 左右孩子指针
}BiTNode,*BiTree;
  • 二叉排序树
//f 指向双亲
//若查找成功,则指针p指向数据元素结点,
//否则指针p指向查找路径上访问的最后一个节点

Status SearchBST(BiTree T,int key, BiTree f,BiTree *p)
{
    if(!T)  //查找不成功
    {
        *p=f;
        return FALSE;
    }
    else if(key==T->data)  //查找成功
    {
        *p=T;
        return TRUE;

    }

    else if(ky<T->data)
       return SearchBST(T->lchild,key,T,p); //左子树继续寻找
    else
       return SearchBST(T->rchild,key,T,p); //右子树继续寻找
}

  • 二叉排序树的插入操作
Status InsertBST(BiTree *T,int key)
{
    BiTree p,s;
    if(!SearchBST(*T,key,NULL,&p))   //查找不成功
    {
        s=(BiTree)malloc(sizeof(BiTNode));
        s->data=key;
        s->lchild=s->rchild=NULL;
        if(!p)
          *T=s; //插入s为新的根结点
         else if(key<p->data)
           p->lchild=s;   //插入s为左孩子
         else
           p->rchild=s;   //插入s为右孩子
         return TRUE;            
    }
    else
      return FALSE;
}
  • 二叉排序树的删除
//1.叶子结点
//2.仅有左子树或者右子树
//3.左右子树都有结点:删除

Status DeleteBST(BiTree *T,int key)
{
    if(*T)
      return FALSE;
    else
    {
        if(key==(*T)->data) 
          return Delete(T);
        else if(key<(*T)->data)
           return DeleteBST(&(*T)->lchild,key);
        else
           return DeleteBST(&(*T)->rchild,key);
    }
}
  • 删除结点
Status Delete(BiTree *p)
{
     BiTree  q,s;
     if((*p)->rchild==NULL)   //只需要接左子树
     {
          q=*p;*p=(*p)->lchild;free(q);
     }

     else if((*p)->lchild==NULL)  //只需要接右子树
     {
         q=*p;*p=(*p)->rchild;free(q);
     }

     else  //左右子树都非空
     {
         q=*p;s=(*p)->lchild;
         while(s->rchild)  //转左,然后向右到尽头(待删除的点的前驱)
         {
             q=s;s=s->rchild;
         }

         (*p)->data=s->data;  //s指向被删除点的前驱
         if(q!=*p)
            q->rchild=s->lchild;  //重接q的右子树
         else
            q->lchild=s->lchild;  //重接q的左子树
         free(s);
     }
     return TRUE;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值