数据结构 (四)树之删除结点篇

删除树的结点是树的操作之中相对比较复杂的。

本文基于二叉排序树的基础上进行树的结点删除操作,删除结点后还要保持二叉树的有序。

 

考虑三种情况:
(1)要删除的是叶结点: 先查找到这个结点,直接删除, 并再修改其父结点指针---置为NULL

图1


 

 

(2)要删除的结点只有一个孩子结点: 将其父结点的指针指向要删除结点的孩子结点

图1
图2
图3​​​​

 

 

 

 

 

(3)要删除的结点有左、右两棵子树:用另一结点替代被删除结点: 右子树的最小元素 或者 左子树的最大元素

 

删除结点41

第一种:取右子树中的最小元素替代 (用50替代41)

图1
图2

 

 

 

 

 

 

第二种:取左子树中的最大元素替代(用35替代41)
 

图1
图2

 

 

 

 

 

 

 

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值