最初看到这样一句话:
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 了