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

删除节点

删除一个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;     //删掉左(右)子树的最大(小)节点
        }
    }
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邢饱饱

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值