数据结构和算法学习记录——二叉搜索树的插入操作、删除操作

news2024/11/15 17:46:19

目录

二叉搜索树的插入

思路图解

代码实现

要点 

例题

二叉搜索树的删除

情况一

情况二

情况三 

右子树的最小元素

左子树的最大元素 

代码实现


二叉搜索树的插入

要进行二叉搜索树的插入,

关键点在于要找到元素应该插入到哪个位置,可以采用与Find类似的方法,

将要插入的节点与根节点进行比较,如果大于根节点,就往右边走;

若小于根节点,就往左边走;

直到某一个节点的左子树或者右子树为空就停止,进行节点的插入操作。

思路图解

代码实现

BinTree Insert(ElementType x, BinTree BST)
{
	if (!BST)    //若树为空,则创建并返回一个节点的二叉搜索树
	{
		BST = malloc(sizeof(struct TreeNode));
		BST->data = x;
		BST->Left = BST->Right = NULL;
	}
	else if (x > BST->data)     //开始查找要插入元素的位置
	{
		BST->Right = Insert(x, BST->Right);   //递归进入右子树
	}
	else if (x < BST->data)
	{
		BST->Left = Insert(x, BST->Left);    //递归进入左子树
	}
	//else
	//{
	//	//x匹配成功,则说明都不做
	//}
	return BST;
}

要点 

需要注意的是:

当找到了新节点应该插入的位置时,需要通过找到上一个节点的地址,来将上一个节点的左子树指针或者右子树指针指向新节点。

例如:

例题

以一年十二个月的英文缩写为键值,按从一月到十二月的顺序输入

即输入序列为:

Jan、Feb、Mar、Apr、May、Jun、July、Aug、Sept、Oct、Nov、Dec。

它形成的二叉搜索树是怎样的呢? 

这里月份缩写键值的比较,按照的是字母在字典中的排序大小,如A最小,Z最大。如果第一个字母相同,则继续比较第二个字母。

形成的二叉搜索树就为:

 

二叉搜索树的删除

二叉搜索树的删除需要考虑三种情况:

情况一

1.要删除的节点是叶节点:

那么就可以直接删除,并再修改该节点的父节点指针——置为空。

例:

情况二

2.要删除的节点只有一个孩子节点:

那么就将该节点的父节点的指针指向要删除节点的孩子节点。

例:

情况三 

3.要删除的节点有左、右两颗子树:

这种情况是比较复杂的,我们把复杂的问题问题转换为简单的问题。

我们已经知道了没有孩子节点的情况和只有一个孩子节点的情况该怎么删除了,当有两个孩子节点的情况时,就考虑能不能把它变成只有一个孩子节点的情况来处理呢?

是可以实现的:用另一节点替代被删除的节点,这个节点应是右子树的最小元素或者左子树的最大元素。

例:

右子树的最小元素

左子树的最大元素 

 

 所以删除节点有两个孩子节点的情况下,我们就变成了在右子树找最小元素或者在左子树找最大元素的问题了。这样处理的好处是:左子树的最大值一定不是有两个孩子节点的情况、而右子树的最小值也一定不是有两个孩子节点的情况。

代码实现

BinTree Delete(ElementType x, BinTree BST)
{
	Position Tmp;
	if (!BST)
	{
		printf("要删除的元素未找到\n");
	}
	else if (x < BST->data)
	{
		BST->Left = Delete(x, BST->Left);  //查找节点,往左子树递归
	}
	else if (x > BST->data)
	{
		BST->Right = Delete(x, BST->Right);//查找节点,往右子树递归
	}
	else                                   //找到了要删除的节点
	{
		if (BST->Left && BST->Right)     //被删除的节点有左右两个孩子节点
		{
			Tmp = FindMin(BST->Right);   //在右子树中找到最小元素
			BST->data = Tmp->data;       //将最小元素填充到要删除的节点位置
			BST->Right = Delete(BST->data, BST->Right);
			//在要删除节点的右子树里删除那个最小元素
		}
		else                             //被删除的节点只有一个孩子节点或者没有孩子节点
		{
			Tmp = BST;
			if (!BST->Left)              //有右孩子节点或者没有孩子节点
			{
				BST = BST->Right;
			}
			else if (!BST->Right)        //有左孩子节点或者没有孩子节点
			{
				BST = BST->Left;
			}
			free(Tmp);
		}
	}
	return BST;
}

 


end


学习自:MOOC数据结构——陈越、何钦铭

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

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

相关文章

Echarts数据可视化(下)

四、数据可视化项目实战 后台搭建 结合Vue开发图表组件 WebSocket实现数据推送 主题切换/页面合并/全屏切换 4.1 Koa2 学习介绍&#xff1a;koa2 - 简书 官网&#xff1a;Koa (koajs) -- 基于 Node.js 平台的下一代 web 开发框架 | Koajs 中文文档 4.1.1 Koa2 的介绍 基…

springboot+vue校园新闻网站(源码+说明文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的校园新闻网站。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌&a…

【数据结构】树及二叉树的概念

&#x1f61b;作者&#xff1a;日出等日落 &#x1f4d8; 专栏&#xff1a;数据结构 一次失败&#xff0c;只是证明我们成功的决心还够坚强。 ——博 维 目录 &#x1f384;树概念及结构: ✔树的概念: ✔树的相关概念 :​编辑 ✔树的…

【C++】-一文让你半只脚进入C++,还不进来看看??

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; C入门 前言一、C关键字二、namespace和using关键字2.1namespace和using的使用2.2names…

WebStorm前端启动JetLinks 物联网基础平台(2.x)

目录 一、环境准备 二、下载源码 三、安装依赖 ​四、修改配置 五、启动项目 六、访问项目 一、环境准备 1.降级node版本为12.22.0 使用node版本管理器gnvm_苍穹之跃的博客-CSDN博客以管理员身份打开cmd&#xff0c;cd到node安装目录。https://blog.csdn.net/wenxingch…

联发科 2024届 IC实习笔试分析

说明 记录一下 4月19日晚&#xff0c;发哥的一场笔试。分享给需要的 IC 人。 岗位&#xff1a;数字IC设计验证&#xff08;安徽 合肥&#xff09; 转载要经本人同意&#xff01; 我的见解不一定都是准确的&#xff0c;欢迎评论区交流指正~~ 1、&#xff08;20分&#xff0…

滚动条如何设置样式和滚动条悬浮显示与隐藏

文章目录 一、滚动条如何设置样式1&#xff1a;滚动条的默认样式&#xff08;如下图&#xff09;1&#xff1a;html代码2&#xff1a;css代码3&#xff1a;效果图 2&#xff1a;CSS设置滚动条的属性&#xff08;重点&#xff09;3&#xff1a;设置滚动条的例子1&#xff1a;css…

java面经01-基础篇-排序算法、ArrayList、Iterator、LinkedList、HashMap、单例模式

文章目录 基础篇1. 二分查找2. 冒泡排序3. 选择排序4. 插入排序5. 希尔排序6. 快速排序7. ArrayList7.1 初始化:7.2 add扩容7.3 addAll扩容 8. Iterator8.1 ArrayList 源码分析8.2 CopyOnWriteArrayList 源码分析 9. LinkedList10. HashMap1&#xff09;基本数据结构2&#xff…

C#基础学习--LINQ(2

标准查询运算符 标准查询运算符由一系列API方法组成 序列指实现了Ienumerable<>接口的类&#xff0c;包括List<>,Dictionary<>,Stack<>,Array等 标准查询运算符的签名 扩展方法是公共的静态方法&#xff0c;尽管定义在一个类中&#xff0c;但目的是为…

python整活时间到——27行代码一键获取写真集~~~

嗨害大家好鸭&#xff01;我是爱摸鱼的芝士❤ 来吧&#xff0c;直接整活~ 先准备一下 首先咱们需要安装一下这两个第三方模块 requests >>> parsel >>> 不会安装的小伙伴&#xff0c;键盘按住winr 在弹出来的运行框 输入cmd 按确定&#xff0c;然后弹出…

【python中的协程了解一下?】

什么是协程 协程&#xff08;Coroutine&#xff09;是一种比线程更加轻量级的并发方式&#xff0c;它不需要线程上下文切换的开销&#xff0c;可以在单线程中实现并发。协程通常具有以下特点&#xff1a; 协程中的代码可以暂停执行&#xff0c;并且在需要的时候可以恢复执行。…

我的Qt作品(18)模仿Qt Creator IDE写了一个轻量级的视觉框架

Qt Creator的源码比较庞大。前几年我陆陆续续读过里面的源码。也写了几篇博文&#xff1a; https://blog.csdn.net/libaineu2004/article/details/104728857 https://blog.csdn.net/libaineu2004/article/details/89407333 最近一直想找机会&#xff0c;借用这个IDE的皮&…

谷歌Chrome浏览器在新标签页打开书签链接的五个方法

方法一&#xff1a;快捷键Ctrl/Command键 Ctrl/Command 左键单击书签 方法二&#xff1a;右键菜单建立新的标签页 在书签上单击右键选择【在新标签页中打开】 方法三&#xff1a;鼠标中键/拖拽到新标签页 拖拽方法&#xff1a;点击对应书签的文字或者图标——拖拽到浏览器…

Unity出模型动画的序列帧(特效序列帧)

模型动画的序列帧 我这里是通过Recorder和Timeline的结合操作&#xff0c;输出带有透明通道是序列帧图片 流程图 #mermaid-svg-ig9s3Ys4ZkUqP2IW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ig9s3Ys4ZkUqP2IW …

机器学习 day03(成本函数,简化后的和一般情况下的成本函数)

1. 成本函数 平方误差成本函数是最通常用于线性回归的成本函数最终&#xff0c;我们要找到一组w和b&#xff0c;让j函数的值最小误差&#xff1a;ŷ - y 2. 简化后的平方误差成本函数&#xff0c;即b 0 当w 1时&#xff0c;f(x) x&#xff0c;J(1) 0 左侧为f(x)函数&am…

QT笔记——信号转发器之QSignalMapper

QSignalMapper类可以看成是信号的翻译和转发器。 它可以把一个无参的信号翻译成带以下4种参数的信号再转发&#xff1a;int、QString、 QObject以及QWidget 。 应用场景一般是&#xff1a;有一些信号&#xff0c;发送的参数都是一样的情况下&#xff0c;常用的方法是给每一个信…

mapreduce基础: 手写wordcount案例

文章目录 一、源代码二、运行截图 一、源代码 WordCountMapper类 package org.example.wordcount;import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper;impo…

[架构之路-169]-《软考-系统分析师》-4-据通信与计算机网络-0-Ad hoc网络(分组无线网络)

目录 什么是Ad hoc网络 adhoc无线网络的历史 ad hoc特点 独立性 结构 通信带宽 主机能源 分布式特性 生存周期 物理安全 adhoc无线网络的结构 adhoc无线网络的应用 什么是Ad hoc网络 Ad hoc是一种多跳的、无中心的、自组织无线网络&#xff0c;又称为多跳网&#xff08;M…

天龙八部手游服务端架设搭建教程

天龙八部手游服务端架设搭建教程 大家好&#xff0c;我是艾西。最近更新游戏搭建教程比较少也被不少小伙伴催更&#xff0c;今天我和大家聊聊天龙八部手游服务端架设搭建。 游戏讲述元佑元年&#xff0c;大宋遭受辽国入侵的故事&#xff0c;玩家可扮演峨眉、丐帮、天山、逍遥、…

SQL Server基础 第一章 (新建,分离,附加)

目录 前言 一&#xff0c;新建数据库 二&#xff0c;分离数据库 1&#xff0c;右键数据库&#xff0c;任务&#xff0c;分离 2&#xff0c;右键数据库&#xff0c;任务&#xff0c;分离 三&#xff0c;附加数据库 前言 本文主要详细介绍SQL server2019的简单使用&#xf…