数据结构:Map 和 Set(一) - 指南

news/2025/9/28 17:58:46/文章来源:https://www.cnblogs.com/slgkaifa/p/19117309

数据结构:Map 和 Set(一) - 指南

1.开头

在此之前,我们要先来了解 TreeMap 和 TreeSet 的使用;从上图我们可以看出,TreeMap 和 HashMap 都属于Map,而 Map 比较特殊,它不属于 Collection,而是自己作为父类。

TreeSet 和 HashMap 的结构与 Map 类似,TreeSet 属于 SortedSet,SortedSet 属于 Set;而 HashSet 直接属于 Set 。

由于 TreeMap 和 TreeSet 的使用是基于二叉搜索树来完成的,所以我们要先来进行二叉搜索树的学习。

2.二叉搜索树

二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树,满足以下性质:

1. 对于树中的每个节点,其左子树中的所有节点的值均小于该节点的值。

2. 其右子树中的所有节点的值均大于该节点的值。

3. 左右子树也分别为二叉搜索树

4. 节点中不能有相同的值。

关于二叉搜索树,它也与二叉树一样,也有增删查改的操作,现在我们一个个来看看。

2.1 查找

2.1.1 基本思路

通过既然是查找元素,那么可能就会有以下三种情况,大家能够先猜一猜:

1. 树为空时的情况;当树为空的时候,由于二叉树的节点是引用类型,所以我们要 return null。

2. 树不为空的情况;树不为空的时候,那在查找的时候就会出现要查找的值比当前的值要小的时候和比当前节点值要大的时候,这里大家就要分情况讨论,也很便捷。先定义一个指针 cur ,从根节点开始走,比当比当前节点值要小的时候,让 cur 向左走;反之则向右走。直到能够找到元素或者是全部遍历完了还没找到的情况,那就要看下一步了。

3. 找不到元素的情况。我们直接 return null 即可。下图为代码实现:

2.2.2 代码实现

查找的时间复杂度:最好情况:O(logN),以2为底。

最坏情况:O(N)。

2.2 插入

2.2.1 基本思路

插入元素,也有可能会出现以下情况,大家同样先猜一猜,这一步也是为了锻炼你们的思考能力,自己尝试思考还是非常重要的。

1. 该树没有元素,即为空树;这时我们直接插入即可。

2.该树有元素,那我们就要先查找,查找到合适的位置时我们再进行插入;那话说回来,我们刚刚是不是已经写过查找的代码了?所以这一步咱们可以直接沿用上面写好的代码。然后插入时我们要注意,如果你和插入一样只用一个指针去遍历的话,那到最后你也只是找到要插入的节点,但不能进行插入,缘于那个节点是空指针,你直接插入的话会引发空指针异常!!!这一点需要注意。那么该如何去消除呢?也很简单,再申请一个变量 parent ,这个变量的指向每次都指向上次的 cur 的指向,最后执行插入的时候,我们直接让 parent 的左或右是要插入的 node 就行了。

大家可以IDEA中自己尝试一下,下图是代码实现:

2.2.2 代码实现

2.3 删除

2.3.1 基本思路

这个删除的操作相比前两个操作来说会难一些,因为有一种情况会比较难处理,我们先来一个个看看各种情况。

1.cur.left == null

(1) cur root,则root = cur.right

(2) cur不是 rootcur parent.left,则parent.left = cur.right

(3) cur不是 rootcur parent.right,则parent.right = cur.right

2. cur.right == null

(1) cur root,则root = cur.left

(2)cur不是 rootcur parent.left,则parent.left = cur.left

(3) cur不是 rootcur parent.right,则parent.right = cur.left

3. cur.left != null && cur.right != null

需要使用替换删除法进行删除:在它的左子树找到最大值节点或在它的右子树中找到,用它的值填补到被删除节点中,再来处理该结点的删除问题。

2.3.2 代码构建

在删除之前,同样大家要查找被删除元素的元素。此时,查找的代码同样可以再次被运用,这一部分直接摘下来即可。由于替换删除法是需要“用合适的值填补到被删除节点中”,那么其实也就是插入,所以这里插入的代码我们也许可摘下来。到头来,实际上我们要完成的就是删除部分的代码。

删除部分:这里只讲左树与右树情况下的查找替换法。(这里以右树的最小值为例)

与替换法类似,这里我们定义 targetParent 和 target 。(和 parent 和 cur 类似)既然我们是以右树的最小值为例,那么右树的最小值一定在它的最左边的叶子结点,所以我们要让刚刚定义的指针一直往左走即可(这一步是要写成循环的)。走完之后说明肯定是找到了,那我们就令准备被删除的值等于该节点的值。

最后,我们得调整一下这个二叉搜索树,因为它不能存在相同的值。有一种情况可能会出现:假如 target 的左边没有节点而右边有节点,那我们就需要 targetParent.left = target.right;反之我们就 targetParent.right = target.right;

3. 二叉搜索树总结

单支树

二叉平衡树,才能达到logN,那大家该如何改进,才能避免单支树拖慢时间复杂度呢?就是如果退化成单支树,二叉搜索树的性能就失去了。必须要

答:这里大家就要去运用 Map 和 Set 去克服了。这部分下篇文章我们再去讲。

4. 习题

一个学习的过程中少不了习题的巩固,让我们来做一些习题吧。

答:D;C选项从概念中可以得出以下性质:

1. 二叉搜索树中最左侧节点一定是最小的,最右侧节点一定是最大的;

通过2. 对二叉搜索树进行中序遍历,能够得到一个有序的序列。

而D选项,在单支树情况下时间复杂度会达到O(N),C选项错误。

答:B;二叉搜索树有个特性:中序遍历的结果是有序的。

答:A;由概念可知。

下一个文章大家就会讲到 HashSet 和 HashMap ,这一部分对于许多算法题都会用到,十分重要。

那么,本篇文章到此结束!

本篇文章的截图,部分摘自于比特科技 。希望能对你有帮助。

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

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

相关文章

《算法与数据结构》第七章[第1节]:图 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

高校校园网网站内容如何建设做网站策划计划书

1.栈与队列 文章目录 1.栈与队列写在前面1.1栈与队列理论基础1.2用栈实现队列1.3用队列实现栈1.4有效的括号1.5删除字符串中的所有相邻重复项1.6逆波兰表达式求值1.7滑动窗口最大值1.8前K个高频元素 Reference 写在前面 本系列笔记主要作为笔者刷题的题解,所用的语…

Altium Designer 25.8.1 最新版安装指南

软件介绍 Altium Designer 25.8.1是一款功能强大的电子设计自动化(EDA)软件,广泛应用于消费电子、通信、汽车、航空航天等行业的电子设计开发。它集成了原理图设计、PCB布局、3D建模、仿真、文档生成等功能,无需切…

2025 年最新推荐地坪源头厂商权威排行榜:聚焦环氧 / 聚氨酯 / 固化剂等多类型地坪,精选 TOP5 优质企业水性聚氨酯/环氧/密封固化剂地坪施工厂商推荐

2025 年地坪行业虽在绿色环保与智能化趋势下持续发展,但市场乱象依旧突出。大量中小企业扎堆低端市场,同质化竞争激烈,价格战频发导致产品与服务质量参差不齐;高端功能性地坪材料仍存在部分依赖进口的情况,国产替…

杂题笔记

CF2133F Flint and Steel 首先把每个能爆炸的苦力怕爆炸极限跑出来,配合苦力怕位置(核心)组一个结构体 注意到爆炸序列是合法当且仅当不存在两个被引爆的苦力怕,他们的互相包含对方的核心 那么相邻两个苦力怕存在三…

HyperWorks许可证服务器配置

在复杂的工程设计和仿真环境中,高效、稳定的许可证服务器配置是确保团队顺畅协作、资源最大化利用的关键。HyperWorks作为业界领先的工程仿真软件,提供了灵活、可靠的许可证服务器配置方案,帮助用户轻松管理许可证资…

算法篇

算法 Algorithm 模拟 Simulation 模拟是基础,体现出你的代码能力,同时也考察你的阅读理解,以及情况是否考虑清楚 基本功:字符串输入[蓝桥杯 2022 国 AC] 内存空间 计算某年某月某日是星期几:如果纯模拟非常麻烦,…

企业网站设计模板免费下载夜间直播平台排行榜前十名

1、前言 本章将介绍yolov5的改进项目,为v5增加新的模块---注意力机制、SE模块 大部分更改的代码是重复的,只有少部分需要更改,下面会详细讲解 yolov5的yaml文件介绍:YOLOV5 模型:利用tensorboard查看网络结构和yaml文件介绍-CSDN博客 yolov5的模块更改,C3更改为C2f模块…

广东省建设厅投诉网站服务器网站过多对排名

无符号文件的驱动中断DriverEntry方法 当我们调试有符号的windows驱动时,通常可以使用bu module!DriverEntry, 在模块的DriverEntry位置打上断点。 那么对于无符号驱动,应该如何找到DriverEntry函数的位置呢? 从正常的DriverEntry的调用栈…

帮网站做代理怎么在网上做广告宣传

导读:面向应用工程师的商业软件咨询、自研软件定制开发服务的仿真公众号,点击关注进入菜单,查看更多精彩内容。(三)如何实现多核并行计算呢?了解了多核、多Machine、多Rack后,我可以看一下软件(程序)是如何对这些资源进…

网站备案用座机租用办公空间设计主题名称

👉原文阅读 💡章前提示 本文采用8084端口进行连接,是EMQX 默认提供了四个常用的监听器之一,如果需要添加其他类型的监听器,可参考官方文档🔗管理 | EMQX 文档。 本文使用自签名CA,需要提前在L…

2025 年二氧化氯发生器厂家最新权威推荐排行榜:TOP 级企业技术实力与成本优势解析,助力用户精准选购电解法二氧化氯发生器/电解食盐二氧化氯发生器厂家推荐

随着水处理行业对消毒环节的重视程度不断提升,二氧化氯发生器作为核心消毒设备,其市场需求持续增长。但当前市场中品牌数量众多,产品质量差异显著,部分设备存在技术落后、运行成本高、维护困难等问题,甚至无法满足…

如何找到当前计算机所有的UnrealEngine安装位置

使用UnrealEngine主要有两种方式:1.通过EpicGameLauncher安装 2. 通过源代码自行编译。 1. 通过EpicGameLauncher安装时,安装的版本和安装位置记录在注册表的这个位置:HKEY_LOCAL_MACHINE\SOFTWARE\EpicGames\Unrea…

阿里云函数计算 AgentRun 全新发布,构筑智能体时代的基础设施

随着大模型技术的飞速发展,我们正从云原生时代迈向一个全新的 AI 原生应用时代。智能体(Agent)作为能够自主理解、决策并执行任务的全新应用范式,正在重塑软件的定义。然而,在生产环境中规模化落地 Agent 面临着开…

配电网一次设备

配电网一次设备包括:变压器、断路器、负荷开关、隔离开关、熔断器、电压互感器电流互感器等。1、配电网自动化对一次设备的要求:(1)需要实现遥信功能的开关设备,应至少具备一组辅助触点;需要实现遥测功能的一次设…

Visual Studio 项目中常用的Properties

PropertyExpands ToExample (Debug build of xxx)$(ProjectDir) Full path to the project folder (with trailing \) C:\Repos\xxx\$(SolutionDir) Full path to the solution folder (with trailing \) C:\Repos\xxx…

英文网站群建设平面设计广告设计培训班

在使用CMutex过程中,看到别人使用了CSingleLock类,想着明明CMutex已经可以实现线程同步了,为什么还有使用CSingleLock类呢? 在MFC中,虽然CMutex类本身可以实现线程同步,但通常会与CSingleLock类一起使用&am…

winform 烦人的键盘事件 再遇上 chart 上下左右 失灵

AI 用多了会失去思考耐心using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading…

2025 年铝板品牌最新权威推荐排行榜:1-7 系主流铝板企业 TOP5 精选及工艺品质测评指南1060/1100/3003/3004/5052/6061/6063/6082铝板厂家推荐

在工业制造、建筑装饰、交通运输等领域高速发展的当下,铝板作为核心基础材料,其品质直接决定终端产品的稳定性与使用寿命。当前市场铝板品牌繁杂,部分企业因原材料把控松散、生产工艺落后,导致产品尺寸偏差大、表面…

大型语言模型(LLM)分类与特性全解析 - 教程

大型语言模型(LLM)分类与特性全解析 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…