二叉排序树(搜索树)的建立、插入、查找、删除

本文介绍了二叉排序树的四个基本操作,重点在于删除操作的三种情况分析:删除叶节点、只有一个孩子节点和拥有两个孩子节点的情况。在删除拥有两个孩子节点的节点时,通过找到左子树的最大值或右子树的最小值进行替换,再删除该值,确保树的有序性。
摘要由CSDN通过智能技术生成

本程序的主要难点在于,二叉排序树的删除。删除的结点有三种情况:

1.要删除的是叶结点。这种情况最简单,可以直接删除,然后再修改其父结点的指针置空即可。

2.如果要删除的结点只有一个孩子结点(该结点不一定是叶结点,可以是子树的根),删除之前需要改变父结点的指针,指向要删除结点的孩子结点。

3.如果要删除的结点有左右两棵子树,有两种选择:一、取其右子树中的最小元素。 二、取其左子树中的最大元素。将最小(大)元素的值赋给要删除的结点然后再删除最小(大)结点,这样就又回到了第二中情况只有一个孩子结点。因为不论是左子树的最大值还是右子树的最小值都只有一个孩子结点(否则就不符合最小或者最大了)。本程序采用的是找到左子树的最大值来替代被删除的值。

代码如下:

BSTree DeleteBSTree(BSTree bsTree, int x)
{
    BSTree temp;
    if (bsTree)   //树不为空
    {
        if (x < bsTree->value)
        {
            bsTree->left = DeleteBSTree(bsTree->left, x);   //从左子树递归删除
        }
        else if (x > bsTree->value)
        {
            bsTree->right = DeleteBSTree(bsTree->right, x);  //从右子树递归删除
        }
        else  //查找到了删除结点
        {
            /*当左右结点都存在时,一种是选择左子树的最大值,另一种是选择右子树的最小值*/
            /*本文采用左子树的最大值*/
            if(bsTree->left && bsTree->right)
            {
                /*找到左子树的的最大元素填充删除结点*/
                temp = FindMaxBSTree(bsTree->left);
                bsTree->value = temp->value;

                /*从左子树中删除最大元素*/
                bsTree->left = DeleteBSTree(bsTree->left, bsTree->value);
            }
            else   /*被删除结点有一个或者没有结点*/
            {
                temp = bsTree;
                if (!bsTree->left)           //只有右孩子或者无子结点
                {
                    bsTree = bsTree->right;
                }
                else                         //只有左孩子
                {
                    bsTree = bsTree->left;
                }
                free(temp);
            }
        }
    }
    return 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值