Status Delete_in_BiThrTree(BiThrTree T,BiThrTree F,int x){
//在以(后继)线索二叉树为储存结构的二叉排序树中删除关键字为x的数据元素
//删除成功返回OK,否则返回ERROR
//F为指向T双亲结点的指针
if(!T) return ERROR;
else{
if(T->data == x){
if(!F){//如果一开始的根节点就是要删除的关键字
if(!T->lchild){q = T;T = T->rchild;free(q);return OK;}
p = T;
s = T->lchild;
while(s->RTag == Link){p = s;s = s->rchild;}
T->data = s->data;
p->rchild = s->lchild;
free(s);
if(!p->rchild){p->rchild = T;p->RTag = Thread;}
else{
while(p->RTag == Link) p = p->rchild;
p->rchild = T;
}//else
return OK;
}//if
else{
if(!T->lchild){
if(T->RTag == Thread){
if(F->lchild == T) F->lchild = NULL;
else{F->rchild = T->rchild;F->RTag = Thread}
}//if
else{
if(F->lchild == T) F->lchild = T->rchild;
else F->rchild = T->rchild;
}//else
free(T);
return OK;
}//if
p = T;
s = T->lchild;
while(s->RTag == Link){p = s;s = s->rchild;}
T->data = s->data;
p->rchild = s->lchild;
free(s);
if(!p->rchild){p->rchild = T;p->RTag = Thread;}
else{
while(p->RTag == Link) p = p->rchild;
p->rchild = T;
}//else
return OK;
}//else
}//if
else if(T->data < x) Delete_in_BiThrTree(T->rchild,T,x);
else return Delete_in_BiThrTree(T->lchild,T,x);
}//else
}//Delete_in_BiThrTree
在以(后继)线索二叉树为储存结构的二叉排序树中删除关键字为x的数据元素
最新推荐文章于 2023-04-25 20:16:22 发布