在二叉查找树的操作中,结点的删除是相对复杂的~
设要删除的结点为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
//从二叉查找树总删除结点X
if (!X->lchild &&!X->rchild){
else if(!X->lchild){
el