**
二叉查找树的删除操作C语言描述
**
删除操作是许多数据结构中最困难的操作,一旦发现要被删除的节点,我们需要考虑一下几种可能的情况:
-
:如果要删除的节点是叶子节点,我们可以直接将其删除即可。
-
:如果要删除的节点有一个儿子节点,我们将此节点的父节点的指针指向此节点的儿子节点后,将其删除。
-
:如果要删除的节点有两个儿子节点,我们需要将其右子树的最小数据代替该节点并递归的删除那个节点。
其代码如下:
Search Delete(ElemType X,SearchTree T)
{
Position TmpCell; //建立一个空节点//建立一个空节点
if(T==NULL) //树为空,返回错误
error(''Element not found'');
else if(X<T->ElemType) //树不为空,要删除的节点在树的左子树,递归左子树
T->Left=Delete(X,T->Left);
else if(X>T->ElemType) //树不为空,要删除的节点在树的右子树,递归右子树
T->Right=Delete(X,T->Right);
else if(T->Left&&T->Right) //找到要删除的节点,且此节点有两个儿子节点
{
TmpCell=FindMin(T->Right); //在要删除的右子树中找出右子树的最小值
T->Element=TmpCell->Element; //将右子树中的最小值赋值给要删除的节点
T->Right=Delete(T->Element,T->Right); //递归删除此节点的右子树的最小节点
}
else //找到要删除的节点,且此节点有一个儿子节点
{
TmpCell=T; //将此节点指向TmpCell
if(T->Left==NULL) //如果此节点没有左儿子节点
T=T->Right; //将右儿子节点指向此节点
else if(T->Right==NULL) //如果此节点没有右儿子节点
T=T->Left; //将左儿子节点指向此节点
free(TmpCell); //释放要删除的节点
}
return T;
}