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解决了元素替换是上层建筑的结构问题,替换后,下层建筑的结构还需自己动手连接。