数据结构与算法-树-二分搜索树(二)

news2024/11/20 18:45:52

二叉树节点删除的几种情况

今天我们研究一下二叉搜索树(BST)的删除操作。删除操作对树来讲有些复杂,包含以下场景:

  1. 删除点是叶节点
  2. 删除点非叶节点,只有左子树
  3. 删除点非叶节点,只有右子树
  4. 删除点非叶节点,既有左子树又有右子树

基本步骤

在这里插入图片描述

Java代码的实现过程

第一步:查找要删除的值

如果找到值

 public TreeNode<Integer> delNode(TreeNode<Integer> root, T val){
    if(root.data.compareTo(val) == 0 ){ //查找到要删除的值
        
    }          
 :

当找到要删除的节点时,有四种情况需要考虑

  1. 情况一:如果为叶节点,则删除叶节点,即返回null,断开与其父节点的引用
 if (root.left == null && root.right == null) {
                return null;
  }
  1. 情况二:如果其左节点为null,右节点不为null
 if (root.left == null) {
                return root.right;
  }
  1. 情况三:
 if (root.right == null) {
                return root.right;
  }
  1. 情况四(重点):

使用Hibbard Deletion 的二叉树删除方法
如图所示找到右子树的最小值,将最小值节点替换为删除节点的位置。最小值节点在连接原来节点的左、右子树。连接右子树时删除原来的最小值节点。
在这里插入图片描述

第一步

找到要替换的右子树最小值(65),即右子树中的最左节点(左小右大)。

public TreeNode<T> minNode(TreeNode<T> root) {
    while (root.left != null) {
        root = root.left;
    }
    return root;
}
 TreeNode<T> min = minNode(root.right);

第二步

最小节点连接右侧,再连接左侧。

连接右子树

访问要删除节点(56)的右子树,删除最小节点,返回(56)的右子树。

最小节点连接右子树

 min.right = delNode(root.right,min.data);
连接左子树

最小节点连接左子树

 min.left  = root.left;
回收当前节点

即删除当前节点,返回新的节点引用

return min;

完整代码

public TreeNode<T> delNode(TreeNode<T> root, T val) {
    if (val.compareTo(root.data) == 0) { //找到节点值相等
        //1. 要删除的节点是叶节点
        if (root.left == null && root.right == null) {
            return null;
        }
        //2. 要删除的节点的左节点为空,右节点不为空
        if (root.left == null) {
            return root.right;
        }
        //3.要删除节点的右节点为空
        if (root.right == null) {
            return root.left;
        }
        /*
         * 当前节点的左右节点都不为空,
         * 找到最小节点
         */
        TreeNode<T> min = minNode(root.right);
        min.right = delNode(root.right,min.data);
        min.left  = root.left;

        return min;


    } else if (val.compareTo(root.data) < 0) { //比当前节点值小,递归查找左子树
        root.left = delNode(root.left, val);
    } else { //比当前节点值大,递归查找右子树
        root.right = delNode(root.right, val);
    }
    return root;
}

public TreeNode<T> minNode(TreeNode<T> root) {
    while (root.left != null) {
        root = root.left;
    }
    return root;
}

如果当前值小于节点的值

else if(val.compareTo(root.data) < 0){
	root.left = delNode(root.left, val);
}

如果当前值大于节点的值

else{ //比当前节点值大
	root.right = delNode(root.right, val);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1686819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试-软件工程与设计模式相关,Spring简介

面试-软件工程与设计模式相关&#xff0c;Spring简介 1.编程思想1.1 面向过程编程1.2 面向对象编程1.2.1 面向对象编程三大特征 1.3 面向切面编程1.3.1 原理1.3.2 大白话&#xff1f;1.3.3 名词解释1.3.4 实现 2. 耦合与内聚2.1 耦合性2.2 内聚性 3. 设计模式3.1 设计模型七大原…

【排序算法】堆排序(Heapsort)

✨✨✨专栏&#xff1a;排序算法 &#x1f9d1;‍&#x1f393;个人主页&#xff1a;SWsunlight 目录 ​编辑 前言&#xff1a; 一、堆排序&#xff1a; 时间复杂度&#xff1a; 空间复杂度&#xff1a; 算法稳定性&#xff1a; 二、升序的实现&#xff1a;通过建大堆实…

《Effective Objective-C 2.0》读书笔记——接口与API设计

目录 第三章&#xff1a;接口与API设计第15条&#xff1a;用前缀避免命名空间冲突第16条&#xff1a;提供“全能初始化方法”第17条&#xff1a;实现description方法第18条&#xff1a;尽量使用不可变对象第19条&#xff1a;使用清晰而协调的命名方式第20条&#xff1a;为私有方…

中国真人认证的相亲交友恋爱平台有哪些?测评5款高质量婚恋脱单软件

不少朋友都表示自己的社交圈子过于狭窄&#xff0c;朋友也没几个&#xff0c;那今天就来聊聊我是通过何种平台找到对象的。我与男朋友是在网络上相识的&#xff0c;许多朋友同样也是通过网络来相亲。不过我们的成功&#xff0c;真的真的不能表明网络上全都是好人&#xff0c;各…

你不知道的C语言知识(第2期)

本期介绍&#x1f356; 主要介绍&#xff1a;C语言中一些大家熟知知识点中的盲区&#xff0c;这是第二期。 文章目录 1. 一维数组在内存中的存储方式2. sizeof计算数组元素的个数3. 二维数组3.1 概念3.2 二维数组在内存中的存储3.3 初始化省略行&#xff0c;但不能省略列 4. 变…

【Python】 去除字符串中的所有空白字符

基本原理 在Python中&#xff0c;字符串&#xff08;String&#xff09;是不可变的数据类型&#xff0c;这意味着一旦创建了一个字符串&#xff0c;就不能修改它的内容。然而&#xff0c;我们可以创建一个新的字符串&#xff0c;它包含原始字符串中的字符&#xff0c;但不包含…

入门四认识HTML

一、HTML介绍 1、Web前端三大核心技术 HTML&#xff1a;负责网页的架构 CSS&#xff1a;负责网页的样式、美化 JS&#xff1a;负责网页的行动 2、什么是HTML HTML是用来描述网页的一种语言。 3、Html标签 单标签<html> 双标签<h>内容</h> 4、标…

Visual Studio 下的Qt工程无法打开 “xxx.ui“ 文件和LNK1104 无法打开文件“Qt5Cored.lib”错误

一、问题&#xff1a; VS下Qt环境准备好后&#xff0c;创建了Qt工程然后点击 Form Files 下的 “xxx.ui” 文件&#xff0c;在弹出 Qt 设计师 界面后闪退并显示如下错误&#xff1a; 二、解决 1、工具栏处依次点击&#xff1a;扩展 一> Qt VS Tools 一> options 弹出选…

在windows下dat文件转mat

环境配置 需要安装hdf5库&#xff0c;参考https://blog.csdn.net/qq_36314864/article/details/139168631 代码下载 https://download.csdn.net/download/qq_36314864/89349060 为了支持大文件的.dat文件转换&#xff0c;我们需要考虑如何处理大量数据以避免内存不足的问题…

利用kubeadm安装k8s集群 以及跟harbor私有仓库下载镜像

目录 环境准备 master&#xff08;2C/4G&#xff09; 192.168.88.3 docker、kubeadm、kubelet、kubectl、flannel node01&#xff08;2C/2G&#xff09; 192.168.88.4 docker、kubeadm、kubelet、kubectl、flannel node02&#xff08;…

docker 安装 yapi

文章目录 docker 安装 yapi一、拉取镜像二、创建目录三、添加配置文件四、初始化数据库表五、启动 yapi六、测试以及修改默认密码 没有 MongDB 的可以先看这个教程&#xff1a;MongDB安装教程 docker 安装 yapi 版本&#xff1a; 1.9.5 一、拉取镜像 docker pull yapipro/y…

ClickHouse课件

列式存储数据库&#xff1a;hbase clickhouse 简介 ClickHouse入门 ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库&#xff08;DBMS&#xff09;&#xff0c;使用C语言编写&#xff0c;主要用于在线分析处理查询&#xff08;OLAP&#xff09;&#xff0c;能够使用…

Python中文分词工具库之jieba使用详解

概要 在自然语言处理(NLP)领域,中文文本的分词是一个重要且基础的任务。Python的jieba库是一个广泛使用的中文分词工具,提供了丰富的功能,包括精准模式、全模式、搜索引擎模式等,适用于不同的应用场景。本文将详细介绍jieba库,包括其安装方法、主要特性、基本和高级功能…

Spark累加器

1. 累加器 累加器&#xff1a;分布式共享只写变量 考虑如下计算RDD中数据的和&#xff1a; val rdd sc.makeRDD(List(1, 2, 3, 4))var sum 0 rdd.foreach(num > {sum num} )println("sum " sum) 预期结果10&#xff0c;但其实不是 foreach里面的函数是在…

rtemis 包:多种机器学习算法集成!兼顾数据处理与可视化美图

rtemis 是一个集机器学习与可视化于一体的 R 包&#xff0c;用于各种高级机器学习研究和应用。整体而言&#xff0c;该软件有三个目标&#xff1a; 「应用数据科学」&#xff1a;使高级数据分析高效且易于使用 「机器学习研究」&#xff1a;提供一个平台以开发和测试新颖的机器…

添加、修改和删除列表元素

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 添加、修改和删除列表元素也称为更新列表。在实际开发时&#xff0c;经常需要对列表进行更新。下面我们介绍如何实现列表元素的添加、修改和删除。 …

深度学习之使用Matlab乳腺癌分类检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 乳腺癌作为女性最常见的恶性肿瘤之一&#xff0c;对女性的健康构成了严重威胁。乳腺癌的早期发…

基于51单片机的音乐喷泉

基于51单片机的音乐喷泉 &#xff08;程序&#xff0b;原理图&#xff0b;PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.检测音乐信号的声音强度&#xff0c;使喷头的水柱能够根据音乐的节奏和音量起伏&#xff1b; 2.系统将声音强度转化为模拟信…

神经网络的工程基础(三)——更优化的最优化算法

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 本文将讨论更优化的最优化问题算法。 关于大语言模型的内容&#xff0c;推荐参考这个专栏。 内容大纲 相关说明一、概述二、算…

【你眼中的IT行业现状与未来趋势展望】

随着技术的不断进步&#xff0c;IT行业已成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链&#xff0c;这些技术正在重塑我们的生活和工作方式。你眼中IT行业的现状及未来发展趋势是怎么样的&#xff1f;无论您是行业领袖、技术专家…