二叉排序树关于删除节点的方法(对上一博客的补充)

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