bool SortedBitree::DeleteBST(NodeBitree *&root,const int data){
NodeBitree *index=NULL;
if(NULL==root){
std::cout<<"Empty Tree or not found"<<std::endl;
return false;
}else{
if(root->getdata()==data){
return Delete(root);
}
else if(data<root->getdata())
return DeleteBST(root->getLchild(),data);
else
return DeleteBST(root->getRchild(),data);
}
}
bool Delete(NodeBitree *p){
NodeBitree *q, *s;
if (!p->getLchild() && !p->getRchild())
{
}
else if(!p->getRchild()){ //右子树空则只需重接它的左子树
q=p->getLchild();
p->setdata(p->getLchild()->getdata());
p->getLchild()=p->getLchild()->getLchild();
p->getRchild()=p->getLchild()->getRchild();
}
else if(!p->getLchild()){ //左子树空只需重接它的右子树
q=p->getRchild();
p->setdata(p->getRchild()->getdata());
p->getLchild()=p->getRchild()->getLchild();
p->getRchild()=p->getRchild()->getRchild();
} else{
NodeBitree *s,*q;
q=p;
s=p->getLchild();
while(s->getRchild()){
q=s;
s=s->getRchild();
}
p->setdata(s->getdata());
if(q!=p){
q->getRchild()=s->getLchild();
}else{
q->getLchild()=s->getLchild();
}
}
return true;
}
算法导论第三版上关于删除节点的算法,指出了需要删除节点和实际删除节点
在红黑树时,将NULL变为NIL,并且去掉第一个函数末尾的判断
下面的代码
TRANSPLANT(T,u,v){
if(u.p==NULL)
T.root=v;
else if(u=u.p.left)
u.p.left=v;
else
u.p.right=v;
if(v!=NULL)//在红黑树中词句略去
v.p=u.p;
}
TREE_DEL(T,z){
if(z.left==NULL)
TRANSPLANT(T,z,z.right);
else if(z.right==NULL)
TRANSPLANT(T,z,z.left);
else{
y=TREE_MIN(z.right);
if(y.p!=z){
TRANSPLANT(T,y,y.right);
y.right=z.right;
y.right.p=y
}
TRANSPLANT(T,z,y);
y.left=z.left;
y.left.p=y;
}
上面的TRANSPLANT解决了元素替换是上层建筑的结构问题,替换后,下层建筑的结构还需自己动手连接。