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

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

删除节点

删除一个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;     //删掉左(右)子树的最大(小)节点
        }
    }
}
相关文章
|
1月前
|
Kubernetes 算法 调度
在k8S中,Scheduler使用哪两种算法将Pod绑定到worker节点?
在k8S中,Scheduler使用哪两种算法将Pod绑定到worker节点?
|
1月前
|
算法
【算法】递归、搜索与回溯——汉诺塔
【算法】递归、搜索与回溯——汉诺塔
|
1月前
|
算法
【初阶数据结构篇】二叉树算法题
二叉树是否对称,即左右子树是否对称.
|
2月前
|
传感器 机器学习/深度学习 算法
基于GA遗传算法的WSN网络节点覆盖优化matlab仿真
本研究应用遗传优化算法于无线传感器网络(WSN),优化节点布局与数量,以最小化节点使用而最大化网络覆盖率。MATLAB2022a环境下,算法通过选择、交叉与变异操作,逐步改进节点配置,最终输出收敛曲线展现覆盖率、节点数及适应度值变化。无线传感器网络覆盖优化问题通过数学建模,结合遗传算法,实现目标区域有效覆盖与网络寿命延长。算法设计中,采用二进制编码表示节点状态,适应度函数考量覆盖率与连通性,通过选择、交叉和变异策略迭代优化,直至满足终止条件。
|
1月前
|
算法
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
|
1月前
|
算法
【算法】递归、搜索与回溯——简介
【算法】递归、搜索与回溯——简介
|
2月前
|
算法 Python
python中算法递归错误(Recursion Errors)
【7月更文挑战第18天】
40 1
|
1月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
60 0
|
1月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
32 0
|
2月前
|
算法 JavaScript
JS 【详解】二叉树(含二叉树的前、中、后序遍历技巧和算法实现)
JS 【详解】二叉树(含二叉树的前、中、后序遍历技巧和算法实现)
32 0