关于c语言在二叉排序树中删除节点的一个问题

Satus 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->lchild;//重接*q的右子树
else q->lchild=s->lchild;//重接*q的左子树
delete s;
}
return TRUE;
}//Delete

【【我不懂的地方是当“左右子树均不空”的情况下的程序,它那一堆程序究竟是什么意思?可以一句一句给解释下么???感激!!!】】

q=p;//记下P的位置给q后面用于比较。
s=p->lchild;//将p的左子树给S。
while(s->rchild){q=s;s=s->rchild;}//走到S结点的右尽头。因为是排序树,只有右尽头的结点才在p的左子树和右子树之间来充当将被删除的p结点。
p->data=s->data;这里找到了结点,将它代替P,即将P结点删除了。
if(q!=p)q->rchild=s->lchild;//这里意思是上面循环至少运行过一次,我们找到的结点s可能有左结点,就将左结点充当s,即q的右结点,s的左结点可以为空
else q->lchild=s->lchild;//这里意思是上面循环一次都没运行,即p的左子树上没有右子树。则将s的左结点接在q的左结点上

解释到此,希望你能明白
温馨提示:答案为网友推荐,仅供参考
相似回答