您的位置:首页 > 其它

二叉查找树(Binary Search Tree)--结点的删除操作(导入自原博客)

2011-07-27 22:03 246 查看
在二叉查找树的操作中,结点的删除是相对复杂的~
设要删除的结点为X,主要分三种情况~
1.X为叶子结点,也就是X没有左右孩子,这种情况直接删掉X即可~
2.X只有一个孩子,左孩子或右孩子,这种情况下将X的双亲结点原来指向X的指针指向X的孩子,而后删除X即可~
3.X有左右两个孩子。这是值得注意,也是最复杂的情况。可以首先对二叉查找树进行中序遍历,这种遍历保持了结点大小的相对顺序。找到X的后继元素(前驱也可),设为X_SUCC,使得X_SUCC代替X的位置,从而X的左子树即为X_SUCC的左子树,X的右子树即为X_SUCC的右子树;之后将原来X_SUCC结点的双亲结点指向X_SUCC的指针指向X_SUCC的右孩子(如果是找前驱替代,即指向左孩子);最后把X删掉就OK了~~~~

算法也从这三种情况考虑~
void DeleteBinarySearchTree(BiTree&X){
//从二叉查找树总删除结点X
if (!X->lchild &&!X->rchild){ //X为叶子结点
free(X);
}
else if(!X->lchild){ //X只有右孩子
q=X; X=X->rchild; free(q);
}
else if(!X->rchild){ //X只有左孩子
q=X;X=X->lchild; free(q);
}
else { //X有左右两个孩子
q=X;
s=X->rchild; //寻找X的后继
while(s->lchild){
q=s;s=s->lchild; //最终,s为X的前驱;q为s的双亲结点
}
X->data=s->data; //s替代了X结点
if(q != X){
q->lchild=s->rchild;
}
else{
q->rchild=s->rchild;//q如果就是X,那么s的右孩子变为q的右孩子
}
free(s);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: