最初看到这样一句话:
bool Delete(BST *&u,int v)
{
if(u==NULL)return false;
else if(u->v>v)return Delete(u->Ls,v);
else if(u->v<v)return Delete(u->Rs,v);
else
{
if(u->Ls&&u->Rs)
{
BST *temp=findmax(u->Ls);
u->v=temp->v;
return Delete(temp,temp->v);
}
else
{
if(u->Ls)u=u->Ls;
else if(u->Rs)u=u->Rs;
return true;
}
}
}
我说怎么这里u=u->Rs不是表示移动到他的右儿子么?但是在这里却表示为用u的右儿子把u给覆盖掉了,为啥跟以前用的不一样喃?
原来,关键之处在这里:BST *&u
用的是指针的引用
做了个实验:
int main() { BST *root=NULL; Insert(root,5); Insert(root,6); Insert(root,7); Insert(root,8); Insert(root,9); Insert(root,10); BST *&p=root; p=p->Rs; BST *pp=root; cout<<pp->v<<"\n"; }
这样出来的结果是6,而如果把 BST *&p=root 改成 BST *p=root 结果就是5 了