当前位置: 首页 > article >正文

en造数据结构与算法C# 之 二叉排序树的删除

en造数据结构与算法C# 之 二叉排序树的增/查-CSDN博客

删除方法比起添加和查找就稍显复杂了 ,所以单独拿出来写一篇

分析

输入

1.根节点,用于从根上查找你要删除的节点

2.需要删除的值

   public Node<T> Delete(Node<T> root, T data) {
       if (root == null)
           return root;

删除节点比如,比如我有一个如下的二叉树

 1.找到最后,要删除的节点是叶子节点

删除20

2.找到最后,要删除的节点只有一个子节点

删除70,我们会发现

3.找到最后,发现要删除的节点的子树是满的,左右叶子都有

那就需要从该节点的右子树去找最小值替换该位置

所以,从程序上来讲的话,需要分一个状态+两种情况

一个状态 = 找到需要删除的位置

两种情况 = 1.要删除的是叶子节点或者只有一个子节点 + 2.左右子节点都存在

上代码


    /// <summary>
    /// 删除节点
    /// </summary>
    /// <param name="root">根节点</param>
    /// <param name="data">需要删除值</param>
    /// <returns></returns>
    public Node<T> Delete(Node<T> root, T data) {
        if (root == null)
            return root;

        // 找到要删除的节点
        if (data.CompareTo(root.data) < 0)
            root.LeftNode = Delete(root.LeftNode, data);
        else if (data.CompareTo(root.data) > 0)
            root.RightNode = Delete(root.RightNode, data);
        else {
            // 情况1:节点是叶子节点或只有一个子节点
            if (root.LeftNode == null)
                return root.RightNode;
            else if (root.RightNode == null)
                return root.LeftNode;

            // 情况2:节点有两个子节点
            // 找到右子树中的最小值节点
            root.data = MinValue(root.RightNode);
            // 删除右子树中的最小值节点
            root.RightNode = Delete(root.RightNode, root.data);
        }

        return root;
    }

    private T MinValue(Node<T> root) {
        T minValue = root.data;
        while (root.LeftNode != null) {
            minValue = root.LeftNode.data;
            root = root.LeftNode;
        }
        return minValue;
    }


http://www.kler.cn/news/322641.html

相关文章:

  • 哪个快?用300万个图斑测试ArcGIS Pro的成对叠加与经典叠加
  • Spring Task快速入门
  • Autosar学习----AUTOSAR_SWS_BSWGeneral(七)
  • 【GUI设计】基于Matlab的图像特征提取GUI系统(9),matlab实现
  • Win10 QT 配置Android开发环境-jdk/sdk/gradle
  • excel数据常用函数学习记录
  • 0基础跟德姆(dom)一起学AI 数据处理和统计分析05-Pandas数分入门
  • overlayscrollbars使用
  • 【JavaEE精炼宝库】HTTP | HTTPS 协议详解
  • react crash course 2024(7) react router dom
  • 精选10个热门目标检测数据集
  • 基于QT的C++中小项目软件开发架构源码
  • oracle生成时间戳字符的两种方法
  • 教师管理系统小程序+ssm论文源码调试讲解
  • 什么是数据倾斜
  • LeetCode[简单] 136. 只出现一次的数字
  • 网络:TCP协议-报头字段
  • webpack 4 的 30 个步骤构建 react 开发环境
  • mysql复合查询 -- 多表查询(介绍,笛卡尔积,使用),自连接(介绍,使用)
  • MySQL tinyint(1)类型数据在经过flink cdc同步到doris后只有0/1问题定位与解决
  • C#自定义工具类-数组工具类
  • XML 实例:深入解析与实际应用
  • 如何从格式化的笔记本电脑或台式机中恢复照片
  • C++进阶—>这3个问题难道搞不懂多态???
  • 对Spring-AI系列源码的讲解
  • 线性判别分析 (LDA)中目标函数对S_w进行奇异值分解的说明
  • 如何在Mac上查看剪贴板历史记录
  • 数据技术进化史:从数据仓库到数据中台再到数据飞轮的旅程
  • python示例(加减乘除....)
  • Hive SQL业务场景:连续5天涨幅超过5%股票