严蔚敏数据结构中二叉排序树删除操作的问题(与链表比较)

本文探讨严蔚敏《数据结构》中二叉排序树删除操作的疑惑,通过实例分析了二叉排序树删除节点时指针更新与链表删除操作的区别,指出在二叉排序树中,父节点指针更新与链表中不同。
摘要由CSDN通过智能技术生成

        在严蔚敏的《数据结构》中,我看到二叉排序树中有几行代码,我理解的不是很清楚,如下,想请教大家,并且加深自己对指针这一块的理解,代码片段如下:

Status Delete(BiTree& p)
{
    //从二叉排序树中删除结点p,并重接它的左或右子树
    if(! p->rchild) //右子树为空则只需重接它的左子树 
    {
        q = p;
        p = p->lchild;
        free(q);
    }
    //剩余情况在此省略了...
}

        对于上面这三行代码,我有一点疑惑之处在于:我们虽然执行了p = p->lchild,但是依据链表知识的学习,假设p所指向的结点的父结点为f的话,不应该也改变f->lchild或者f->rchild吗?后来,我查到有人对这几行的解释是:

q = p;  //我们不妨设p是其父结点的rchild, 所以这行代码的意思就是: 
        //将父结点的->rchild空间中存放的待删除结点p的地址放入q中

p = p->lchild; //将待删除结点左孩子的地址放入父结点的->rchild空间中
free(q);

        我带着疑惑与少许的理解,把书中所给的伪代码修改成可以跑通的,我用45, 24, 53, 45, 12, 24, 50, 40这几个数做一个测试,正确的二叉排序树应该是这样:

                                                         

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值