在严蔚敏的《数据结构》中,我看到二叉排序树中有几行代码,我理解的不是很清楚,如下,想请教大家,并且加深自己对指针这一块的理解,代码片段如下:
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这几个数做一个测试,正确的二叉排序树应该是这样: