二叉排序树删除节点的操作
void Delete(Bitree &p)
{//从二叉排序树中删除节点p,并重接它的左或右子树
if(!p->rchild)//右子树空则只需重接它的左或右字数
{
q=p;p=p->lchild;
free(q);
}
else if(!p->lchild)//只需重接它的右子树
{
q=p;
p=p->rchild;
free(q);
}
else//左右字数均不空
{
q=p;
s=p->lchild;
while(s->rchild)
{//转左,然后向右到尽头
q=s;
s=s->rchild
}
p->data=s->data; //s指向被删除节点的前驱
if(q!=p) q->rchild=s->lchile; //重接*q的柚子树
else q->lchild=s->lchild;//重接*q的左子树
}
}
上面红体字部分什么意思,看不懂啊
[解决办法]
不好意思看错了。没有注意到排序两个字。
删除的节点拥有左右子节点,那么必须寻找到一个节点放置在该节点处。所以最接近的节点就是左子树的最右端的叶子节点,既:中序遍历的时候当前删除节点的前继节点。然后将该节点内的值赋值给删除的节点,再重新拼接二叉树就OK啦。可以画个图看看就知道了