删除树的结点是树的操作之中相对比较复杂的。
本文基于二叉排序树的基础上进行树的结点删除操作,删除结点后还要保持二叉树的有序。
考虑三种情况:
(1)要删除的是叶结点: 先查找到这个结点,直接删除, 并再修改其父结点指针---置为NULL
(2)要删除的结点只有一个孩子结点: 将其父结点的指针指向要删除结点的孩子结点
(3)要删除的结点有左、右两棵子树:用另一结点替代被删除结点: 右子树的最小元素 或者 左子树的最大元素
删除结点41
第一种:取右子树中的最小元素替代 (用50替代41)
第二种:取左子树中的最大元素替代(用35替代41)
BinTree Delete( ElementType X, BinTree BST )
{
Position Tmp;
if( !BST ) printf("要删除的元素未找到");//判断树是否为空
else if( X < BST->Data ) //与根结点比较
BST->Left = Delete( X, BST->Left); /* 左子树递归删除 */
else if( X > BST->Data )
BST->Right = Delete( X, BST->Right); /* 右子树递归删除 */
else /*找到要删除的结点 */
if( BST->Left && BST->Right ) /*被删除结点有左右两个子结点 */
{
Tmp = FindMin( BST->Right );
/*在右子树中找最小的元素填充删除结点*/
BST->Data = Tmp->Data;
BST->Right = Delete( BST->Data, BST->Right);
/*在删除结点的右子树中删除最小元素*/
}
else /*被删除结点有一个或无子结点*/
{
Tmp = BST;
if( !BST->Left ) /* 有右孩子或无子结点*/
BST = BST->Right;
else if( !BST->Right ) /*有左孩子或无子结点*/
BST = BST->Left;
free( Tmp );
}
return BST;
}