猴-儿 2016-09-15 11:10 采纳率: 40%
浏览 3068
已采纳

C语言实现:二叉排序树结点的删除

struct BSTree
{
int data;
struct BSTree *lchild;
struct BSTree *rchild;
};

若p为二叉排序树t中的一个叶子结点,如何在t中把p结点删除??
t为BST的根结点,要求最后遍历t得到的树中不含p

我知道结点的删除在结构体中加一个struct BSTree *parents; 可以成功实现,但想知道如果没有定义指向双亲结点的指针,如何删除叶子节点?

  • 写回答

2条回答 默认 最新

  • kes55 2016-09-15 11:46
    关注

    void DeleTree(BTree T,int data)
    {
    BTree *p=T,*f=T,temp;
    /
    寻找需要删除的点*/
    while(*p)
    {
    if((*p)->key==data)
    break;
    else if(data>(*p)->key)

    {
    f=p;
    (*p)=(*p)->rchild;
    }
    else if(data<(*p)->key)
    {
    f=p;
    (*p)=(*p)->lchild;
    }
    }/*找到后,p为目标结点,f为其父结点*/

    if(!(*p))                          //找不到
        printf("错误,无此数据");
    //以下为找到的情况
    else if( (*p)->lchild==NULL )      //情况1:p无左子树  
    {
        if( (*f)->rchild=(*p) )        //p为f的右子树
            (*f)->rchild=(*p)->rchild; //直接将p的右子树连接在f的右子树上
        else if( (*f)->lchild=(*p) )   //p为f的左子树
            (*f)->lchild=(*p)->rchild; //直接将p的右子树连接在f的右子树上
        free(*p);
    }
    else if( (*p)->rchild==NULL )      //情况2:p无右子树
    {
        if( (*f)->rchild=(*p) )        //p为f的右子树
            (*f)->rchild=(*p)->lchild; //直接将p的左子树连接在f的右子树上
        else if( (*f)->lchild=(*p) )   //p为f的左子树
            (*f)->lchild=(*p)->lchild; //直接将p的左子树连接在f的右子树上
        free(*p);
    }
    else if( (*p)->lchild==NULL && (*p)->rchild==NULL )//情况3:p无左子树和右子树
    {
        if( (*f)->rchild=(*p) )                        //p为f的右子树
            (*f)->rchild=NULL;                         //f的右子树直接置空
        else if( (*f)->lchild=(*p) )                   //p为f的左子树    
            (*f)->lchild=NULL;                         //f的右子树直接置空
        free(*p);
    }
    else if( (*p)->lchild!=NULL && (*p)->rchild!=NULL )//情况4:p有左子树和右子树
    {
        if( (*f)->rchild=(*p) )                        //p为f的右子树
        {
            temp=(*p)->lchild;                         //temp为p的左子树
            while(temp->rchild)                        //在temp的右支寻找空位
                temp=temp->lchild;
            temp->rchild=(*p)->rchild;                 //将p的右子树连接在temp的右子树上
            (*f)->rchild=(*p)->lchild;                 //再将p的左子树连接在f的左子树上
            free(*p);
        }
        else if( (*f)->lchild=(*p) )
        {
            temp=(*p)->lchild;
            while(temp->rchild)
                temp=temp->lchild;
            temp->rchild=(*p)->rchild;
            (*f)->lchild=(*p)->lchild;
            free(*p);       
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?