二叉树删除节点算法---递归

删除节点

删除一个BST的节点要比插入困难一点,但同样是要遵循一个原则,即:删除节点后仍然要保持“小-中-大”的逻辑关系。
假设要删除的节点是x,大体思路如下:

  • 若要删除的节点小于根节点,则递归地在左子树中删除x
  • 若要删除的节点大于根节点,则递归地在右子树中删除x

若要删除的节点恰好就是根节点,则分如下几种情况:

  • a. 根节点若有左子树,则用左子树中最大的节点max替换根节点,并在左子树中递归删除max
  • b. 否则,若有右子树,则用右子树中最小的节点min替换根节点,并在右子树中递归删除min
  • c. 否则,直接删除根节点

代码:

typedef struct bst
{
    //数据域
    int data;
    //指针域
    struct bst *lchild;
    struct bst *rchild;
}BST, *pBST;
//删除二叉树节点算法
pBST bstDelete(pBST root, int data)
{
    if(root == NULL)
        return NULL;
    //0.如果想删除的节点小于根节点
    if(data < root->data)
    {
        root->lchild = bstDelete(root->lchild, data);
    }
    //如果想删除的节点大于根节点
    else if(data >root->data)
    {
        root->rchild = bstDelete(root->rchild, data);
    }
    //如果想删除的节点等于根节点
    else
    {     
        if(root->lchild != NULL)
        {
            pBST max;
            //找到左子树中最大的来替换删除的节点
            for(max = root->lchild; max->rchild!=NULL; max = max->rchild);
            root->data = max->data;

            //再把左子树中最大的节点删掉
            root->lchild = bstDelete(root->lchild, max->data);
        }
        else if(root->rchild != NULL)
        {
            pBST min;
            //找到右子树中最小的来替换删除的节点
            for(min = root->rchild; min->lchild!=NULL; min = min->lchild);
            root->data = min->data;

            //再把右子树中最小的节点删掉
            root->rchild = bstDelete(root->lchild, min->data);
        }
        else
        {
            return NULL;     //删掉左(右)子树的最大(小)节点
        }
    }
}
参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:我行我“速” 设计师:Amelia_0503 返回首页

打赏作者

甜甜的Galier

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值