天天看点

二叉查找树的删除操作C语言描述

**

二叉查找树的删除操作C语言描述

**

删除操作是许多数据结构中最困难的操作,一旦发现要被删除的节点,我们需要考虑一下几种可能的情况:

  1. :如果要删除的节点是叶子节点,我们可以直接将其删除即可。
  2. :如果要删除的节点有一个儿子节点,我们将此节点的父节点的指针指向此节点的儿子节点后,将其删除。
  3. :如果要删除的节点有两个儿子节点,我们需要将其右子树的最小数据代替该节点并递归的删除那个节点。

其代码如下:

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;
}