二叉查找树(Binary Search Tree)--结点的删除操作(导入自原博客)

本文详细探讨了在二叉查找树中删除结点的三种情况:1) 删除叶子结点;2) 删除只有一个孩子的结点;3) 删除有两个孩子的结点,并提供了相应的算法实现。通过中序遍历找到后继元素来替换被删除结点,以保持树的性质。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在二叉查找树的操作中,结点的删除是相对复杂的~

设要删除的结点为X,主要分三种情况~

1.X为叶子结点,也就是X没有左右孩子,这种情况直接删掉X即可~

2.X只有一个孩子,左孩子或右孩子,这种情况下将X的双亲结点原来指向X的指针指向X的孩子,而后删除X即可~

3.X有左右两个孩子。这是值得注意,也是最复杂的情况。可以首先对二叉查找树进行中序遍历,这种遍历保持了结点大小的相对顺序。找到X的后继元素(前驱也可),设为X_SUCC,使得X_SUCC代替X的位置,从而X的左子树即为X_SUCC的左子树,X的右子树即为X_SUCC的右子树;之后将原来X_SUCC结点的双亲结点指向X_SUCC的指针指向X_SUCC的右孩子(如果是找前驱替代,即指向左孩子);最后把X删掉就OK了~~~~

 

算法也从这三种情况考虑~

void DeleteBinarySearchTree(BiTree&X){

//从二叉查找树总删除结点X

if (!X->lchild &&!X->rchild){  //X为叶子结点

       free(X);

   }

else if(!X->lchild){    //X只有右孩子

    q=X; X=X->rchild; free(q);

   }

else if(!X->rchild){   //X只有左孩子

     q=X;X=X->lchild; free(q);

   

else {   //X有左右两个孩子

    q=X;

    s=X->rchild;  //寻找X的后继

    while(s->lchild){

          q=s;s=s->lchild; //最终,s为X的前驱;q为s的双亲结点

       }

     X->data=s->data; //s替代了X结点

     if(q != X){

          q->lchild=s->rchild;

        }

      else{

         q->rchild=s->rchild;//q如果就是X,那么s的右孩子变为q的右孩子

      }

     free(s);

 

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值