【数据结构】搜索树MapSet

目录

1.搜索树

1.1概念

1.2查找

1.3插入

1.4删除

2.Map

2.1map说明

2.2TreeMap和HashMap

2.3常用方法

3.Set

3.1set说明

3.2TreeSet和HashSet

3.3常用方法


1.搜索树

1.1概念

二叉搜索树又称二叉排序树,它或者是一棵空树,或者具有以下性质:

1> 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
2> 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
3> 它的左右子树也分别为二叉搜索树


1.2查找

public class BinarySearchTree {static class TreeNode {public int val;public TreeNode left;public TreeNode right;public TreeNode(int val) {this.val = val;}}public TreeNode root;//根结点public TreeNode search(int val) {TreeNode cur = root;while (cur != null) {if (cur.val < val) {cur = cur.right;} else if (cur.val > val) {cur = cur.left;} else {return cur;}}return null;}
}

1.3插入

从根节点开始,比根结点小向左走,比根结点大向右走,直到达到叶子结点,插入该叶子结点。

public boolean insert(int key) {TreeNode node = new TreeNode(key);//第一次插入if (root == null) {root = node;return true;}//之后的插入TreeNode cur = root;TreeNode parent = null;//用来记录cur的位置while (cur != null) {if (cur.val < key) {parent = cur;cur = cur.right;} else if (cur.val > key) {parent = cur;cur = cur.left;}else { //相同数据不能插入return false;}}if (parent.val > key) {parent.left = node;}else {parent.right = node;}return true;
}

1.4删除

方法:替罪羊删除法

找到左树的最右边,即左树最大值,或找到右树的最左边,即右树的最小值 作为替罪羊。

/*** @param cur 要删除的结点* @param parent 要删除节点的父节点*/
private void remove(TreeNode cur, TreeNode parent) {if(cur.left == null) { //1.cur的左树为空if(cur == root) {root = cur.right;}else if(cur == parent.left) {parent.left = cur.right;}else {parent.right = cur.right;}}else if(cur.right == null) { //2.cur的右树为空if(cur == root) {root = cur.left;}else if(cur == parent.left) {parent.left = cur.left;}else {parent.right = cur.left;}}else { //3.cur的左右树都不为空//方法:替罪羊删除法//找右树的最小值,即右树的最左边作为替罪羊TreeNode targetParent = cur;TreeNode target = cur.right;while (target.left != null) { //直到左树为空,说明已经找到了替罪羊targetParent = target;target = target.left;}cur.val = target.val; //覆盖//回到了上面的情况1和情况2if(target == targetParent.left) {targetParent.left = target.right;}else {targetParent.right = target.right;}}
}

Set中存储key,Map中存储Key-value键值对

2.Map

2.1map说明

Map官方文档:Map (Java Platform SE 8 )

注意:

1.Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或HashMap;

2.Map中存放键值对的Key是唯一的,value是可重复的

3.在TreeMap中插入键值对时,key不能为空,否则会抛出NullPointerException异常,value可以为空。但HashMap的key和value都可以为空;
4. Map中的Key可以全部分离出来,存储到Set中来进行访问(因为Key不能重复);
5. Map中的value可以全部分离出来,存储在Collection的任何一个子集合中(value可能有重复)。
6. Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进行重新插入。

2.2TreeMap和HashMap

MapTreeMapHashMap
底层结构红黑树哈希桶
增删查改复杂度O(logN)O(1)
是否有序关于key有序无序
是否线程安全不安全不安全
增删查改区别需要进行元素比较通过哈希函数计算哈希地址
比较与覆写key必须可比较,否则会抛出ClassCastException异常自定义类型需要覆写equals和hashCode方法
应用场景需要在key有序场景下key是否有序不关心,需要更高的时间性能

2.3常用方法

方法说明
V get (Object key )返回key对应的value
V getOrDefault (Object key, V defaultValue)返回key对应的value, key不存在返回默认值
V put (K key, V value)设置key对应的value
V remove (Object key)删除key对应的映射关系
Set<K> keySet ()

返回所有 key 的不重复集合

Collection<V> values ()返回所有 value 的可重复集合
Set<Map.Entry<K, V>> entrySet ()返回所有的 key-value 映射关系
boolean containsKey (Object key)判断是否包含 key
boolean containsValues (Object value)判断是否包含 value

3.Set

3.1set说明

Set官方文档:Set (Java Platform SE 8 )

注意:

1. Set是继承自Collection的一个接口类;
2. Set中只存储key,并且要求key一定要唯一
3. TreeSet的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的;
4. Set最大的功能就是对集合中的元素进行去重
5. 实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础上维护了一个双向链表来记录元素的插入次序;
6. Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入;
7. TreeSet中不能插入null的key,HashSet可以。

3.2TreeSet和HashSet

类TreeMap和HashMap:

Set底层结构TreeSetHashSet
底层结构红黑树哈希桶
增删查改时间复杂度O(logN)O(1)
是否有序关于key有序不一定有序
线程安全不安全不安全
增删查改区别按照红黑树的特性进行插入和删除先计算key哈希地址,再进行插入和删除
比较与覆写key必须可比较,否则会抛出ClassCastException异常自定义类型需要覆写equals和hashCode方法
应用场景需要在key有序场景下key是否有序不关心,需要更高的时间性能

3.3常用方法

方法说明
boolean add ( E e )添加元素,但重复元素不会被添加成功
void clear ()清空集合
boolean contains ( Object o )判断 o 是否在集合中
Iterator<E> iterator ()返回迭代器
boolean remove ( Object o )删除集合中的 o
int size ()返回 set 中元素的个数
boolean isEmpty ()检测 set 是否为空
Object [] toArray ()将 set 中的元素转换为数组返回
boolean containsAll ( Collection<?> c )判断集合 c 中的元素是否在 set 中全部存在
boolean addAll ( Collection<? extends E> c )将集合c中的元素添加到 set 中,达到去重效果

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

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

相关文章

静态工厂模式,抽象工厂模式,建造者模式

静态工厂模式 ublic class FruitFactory {public static Fruit getFruit(String name) {Fruit fnull;switch (name){case "APPLE":{fnew Apple();}case "BANANA":{fnew Banana();}default :{System.out.println("Unknown Fruit");}}return f;} …

机器学习算法系列————决策树(二)

1.什么是决策树 用于解决分类问题的一种算法。 左边是属性&#xff0c;右边是标签。 属性选择时用什么度量&#xff0c;分别是信息熵和基尼系数。 这里能够做出来特征的区分。 下图为基尼系数为例进行计算。 下面两张图是对婚姻和年收入的详细计算过程&#xff08;为GINI系…

2023.09.10 学习周报

文章目录 摘要文献阅读1-1 题目1-2 创新点1-3 本文工作2-1 题目2-2 什么是图2-3 图神经网络2-4 信息传递3-1 题目3-2 创新点3-3 本文工作 深度学习1.GNN的构建步骤2.构建图的方法3.GNN的简单样例 总结 摘要 本周阅读了三篇文章&#xff0c;第一篇是基于物理信息深度学习和激光…

【C++】学习STL中的list

❤️前言 大家好&#xff01;&#xff0c;今天为大家带来的一篇博客是关于STL中的list&#xff0c;内容主要包括list的介绍使用、list的模拟实现。以及list与vector的对比。 正文 list的介绍和使用 首先&#xff0c;让我们看看list的文档介绍&#xff1a; list是可以在常数范…

PaddleOCR学习笔记3-通用识别服务

今天优化了下之前的初步识别服务的python代码和html代码。 采用flask paddleocr bootstrap快速搭建OCR识别服务。 代码结构如下&#xff1a; 模板页面代码文件如下&#xff1a; upload.html : <!DOCTYPE html> <html> <meta charset"utf-8"> …

数据挖掘的学习路径

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

Docker实战:docker compose 搭建Sonar

1、docker-compose-sonar文件准备 进入/home/docker目录&#xff0c;新建docker-compose-sonar.yml文件&#xff0c;内容如下&#xff1a; version: 3 services: sonar:image: sonarqube:8.9.6-communityrestart: always container_name: sonarqubevolumes:# 设置与宿主机时间…

Redis常见命令

命令可以查看的文档 http://doc.redisfans.com/ https://redis.io/commands/ 官方文档&#xff08;英文&#xff09; http://www.redis.cn/commands.html 中文 https://redis.com.cn/commands.html 个人推荐这个 https://try.redis.io/ redis命令在线测试工具 https://githubfa…

Hive_Hive统计指令analyze table和 describe table

之前在公司内部经常会看到表的元信息的一些统计信息&#xff0c;当时非常好奇是如何做实现的。 现在发现这些信息主要是基于 analyze table 去做统计的&#xff0c;分享给大家 实现的效果某一个表中每个列的空值数量&#xff0c;重复值数量等&#xff0c;平均长度 具体的指令…

9、补充视频

改进后的dijkstra算法 利用小根堆 将小根堆特定位置更改,再改成小根堆 nodeHeap.addOrUpdateOrIgnore(edge.to, edge.weight + distance);//改进后的dijkstra算法 //从head出发,所有head能到达的节点,生成到达每个节点的最小路径记录并返回 public static HashMap<No…

分享 8 个 VSCode 插件,提升你的编码体验

大多数开发者都在不断寻找让开发工作更轻松的方法&#xff0c;我也是如此。合适的工具可以帮助你实现这一目标。 在本文中&#xff0c;我们将探讨我个人使用的八个扩展&#xff0c;以优化我的编码体验。让我们来看看这些扩展的列表&#xff0c;亲自体验它们如何改善你的编码体验…

leetcode897. 递增顺序搜索树(java)

递增顺序搜索树 题目描述中序遍历代码演示 递归专题 题目描述 难度 - 简单 LC - 897. 递增顺序搜索树 给你一棵二叉搜索树的 root &#xff0c;请你 按中序遍历 将其重新排列为一棵递增顺序搜索树&#xff0c;使树中最左边的节点成为树的根节点&#xff0c;并且每个节点没有左子…

如何让 Llama2、通义千问开源大语言模型快速跑在函数计算上?

:::info 本文是“在Serverless平台上构建AIGC应用”系列文章的第一篇文章。 ::: 前言 随着ChatGPT 以及 Stable Diffusion,Midjourney 这些新生代 AIGC 应用的兴起&#xff0c;围绕AIGC应用的相关开发变得越来越广泛&#xff0c;有呈井喷之势&#xff0c;从长远看这波应用的爆…

解除百度安全验证

使用chrome浏览器用百度浏览时&#xff0c;一直弹百度安全验证&#xff1a; 在设置里进行重置&#xff1a; 然后重启浏览器就可以了。

Leetcode:【169. 多数元素】

题目 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 难度&#xff1a;简单 题目链接&#xff1a;169. 多数元素 示例 1&#xff…

“系统的UI”——SystemUI

SystemUI的实现 以StatusBar为例&#xff0c;来分析下Android系统具体是如何实现它们的。 相关代码分为两部分&#xff0c;即&#xff1a; Service部分 代码路径&#xff1a;frameworks/base/services/java/com/android/server。 应用部分 代码路径&#xff1a;frameworks…

对接西部数据Western Digital EDI 系统

近期我们为国内某知名电子产品企业提供EDI解决方案&#xff0c;采用知行之桥 EDI 系统作为核心组件&#xff0c;成功与西部数据Western Digital&#xff08;简称西数&#xff09;建立EDI连接&#xff0c;实现数据安全且自动化传输。 EDI实施需求 EDI连接 传输协议&#xff1a;A…

c++ 学习之 静态成员变量和静态成员函数

文章目录 前言正文静态成员变量初始化操作如何理解共享一份数据访问权限 静态成员函数访问方式静态成员函数只能访问静态成员变量访问权限 前言 静态成员分为 1&#xff09;静态成员变量 所有对象共享一份数据在编译阶段分配空间类内声明&#xff0c;类外初始化 2&#xff09…

Spring 怎么解决循环依赖的呢?

Spring 怎么解决循环依赖 什么是循环依赖那 Spring 怎么解决循环依赖的呢&#xff1f;为什么要三级缓存&#xff1f;⼆级不⾏吗&#xff1f; 什么是循环依赖 Spring 循环依赖&#xff1a;简单说就是自己依赖自己&#xff0c;或者和别的 Bean 相互依赖。 只有单例的 Bean 才存在…

软件测试中的43个功能测试点总结

功能测试就是对产品的各功能进行验证&#xff0c;根据功能测试用例&#xff0c;逐项测试&#xff0c;检查产品是否达到用户要求的功能。针对web系统的常用测试方法如下&#xff1a; 1、页面链接检查&#xff1a; 每一个链接是否都有对应的页面&#xff0c;并且页面之间切换正…