BST树的删除

 

1  删除操作过程分析

从BST树上删除一个结点,仍然要保证删除后满足BST的性质。设被删除结点为p,其父结点为f ,删除情况如下:

①  若p是叶子结点: 直接删除p。

②  若p只有一棵子树(左子树或右子树):直接用p的左子树(或右子树)取代p的位置而成为f的一棵子树。即原来p是f的左子树,则p的子树成为f的左子树;原来p是f的右子树,则p的子树成为f的右子树。  

③ 若p既有左子树又有右子树 :处理方法有以下两种,可以任选其中一种。

◆  用p的直接前驱结点代替p。即从p的左子树中选择值最大的结点s放在p的位置(用结点s的内容替换结点p内容),然后删除结点s。s是p的左子树中的最右边的结点且没有右子树,对s的删除同②。

◆ 用p的直接后继结点代替p。即从p的右子树中选择值最小的结点s放在p的位置(用结点s的内容替换结点p内容),然后删除结点s。s是p的右子树中的最左边的结点且没有左子树,对s的删除同②。

 

2  算法实现

void Delete_BST (BSTNode *T , KeyType  key )

    /*  在以T为根结点的BST树中删除关键字为key的结点   */

         BSTNode *p=T , *f=NULL , *q , *s ;

         while ( p!=NULL&&!EQ(p->key, key) )

         { 

                   f=p ;

                   if (LT(key, p->key) ) p=p->Lchild ;  /*  搜索左子树 */

                   else p=p->Rchild ;  /*  搜索右子树 */   

         }

         if  (p==NULL)  return ;     /*  没有要删除的结点   */

         s=p ;     /*  找到了要删除的结点为p   */

         if (p->Lchild!=NULL&& p->Rchild!=NULL)

         { 

                   f=p ;

                   s=p->Lchild ;         /*  从左子树开始找   */

                   while (s->Rchild!=NULL)

              {  

                            f=s ;

                            s=s->Rchild ;  

                   }

                   /*   左、右子树都不空,找左子树中最右边的结点  */

                   p->key=s->key ;

                   p->otherinfo=s->otherinfo ;

         /*  用结点s的内容替换结点p内容  */

         }   /*  将第3种情况转换为第2种情况*/

         if  (s->Lchild!=NULL)   /*  若s有左子树,右子树为空 */

                   q=s->Lchild ;

         else q=s->Rchild ;

         if  (f==NULL)  T=q ;

         else if (f->Lchild==s)  f->Lchild=q ;

      else f->Rchild=q ;

         free(s) ;

}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值