【Map和Set】(二叉搜索树 查找操作 插入操作 删除操作 Map的使用 Map.Entry<K, V> Set的说明)

news2024/11/13 15:28:36

文章目录

  • 二叉搜索树
    • 查找操作
    • 插入操作
    • 删除操作
  • Map的使用
    • Map.Entry<K, V>
  • Set的说明


二叉搜索树

二叉搜索树:是空树或者是具有下面性质的二叉树

若左子树不为空,则左子树上所有节点的值都小于根节点的值;若右子树不为空,则右子树上所有节点的值都大于根节点的值;左右子树也分别为二叉搜索树.
如:
在这里插入图片描述

查找操作

//查找二叉搜索数中指定的val值
public TreeNode find(int val){
    TreeNode cur = root;
    while (cur != null){
        if (cur.val == val){
            return cur;
        }else if (cur.val > val){
            cur = cur.left;
        }else {
            cur = cur.right;
        }
    }
    return null;
}

插入操作

//插入一个数据
public void insert(int val){
    if (root == null){
        root = new TreeNode(val);
        return;
    }
    TreeNode cur = root;
    TreeNode parent = null;
    while (cur != null){
        if (cur.val < val){
            parent = cur;
            cur = cur.right;
        }else if (cur.val > val){
            parent = cur;
            cur = cur.left;
        } else {
            return;
        }
    }
    TreeNode node = new TreeNode(val);
    if (parent.val < val){
        parent.right = node;
    }else {
        parent.left = node;
    }
}

删除操作

假设待删除的结点是cur,待删除结点的双亲结点为parent

cur.left == null

  1. cur是root,则root = cur.right

在这里插入图片描述
2. cur不是root,cur是parent.left,则parent.left = cur.right
在这里插入图片描述
3. cur不是root,cur是parent.right,则parent.right = cur.right
在这里插入图片描述

cur.right == null

  1. cur是root,则root = cur.left
    在这里插入图片描述
  2. cur不是root,cur是parent.left,则parent.left = cur.left

在这里插入图片描述

  1. cur不是root,cur是parent.right,则parent.right = cur.left

在这里插入图片描述

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

左数找最大,右树找最小

可以在右树里找到最小值,放到要删除的节点,问题就转化成删除右树的最左边的最小值.此时这种情况的删除就变成了上面两种删除的情况.

在这里插入图片描述

代码:

//删除数据
private void removeNode(TreeNode parent, TreeNode cur) {
    if (cur.left == null){
        if (cur == root){
            root = cur.right;
        }else if (parent.left == cur){
            parent.left = cur.right;
        }else {
            parent.right = cur.right;
        }
    } else if (cur.right == null){
        if (cur == root){
            root = cur.left;
        }else if (parent.left == cur) {
            parent.left = cur.left;
        }else {
            parent.right = cur.left;
        }
    }else {
        TreeNode target = cur.right;
        TreeNode targetParent = cur;
        while (target.left != null){
            targetParent = target;
            target = target.left;
        }
        cur.val = target.val;
        if (target == targetParent.left){
            targetParent.left = target.right;
        } else {
            targetParent.right = target.right;
        }
    }
}

Map的使用

Map是一个接口类,该类没有继承自Collection,该类中存储的是<K,V>结构的键值对,并且K一定是唯一的,不
能重复。

Map.Entry<K, V>

Map.Entry<K, V> 是Map内部实现的用来存放<key, value>键值对映射关系的内部类,该内部类中主要提供了
<key, value>的获取,value的设置以及Key的比较方式。

方法作用
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 keySet()返回所有 key 的不重复集合
Collection values()返回所有 value 的可重复集合
Set<Map.Entry<K, V>> entrySet()返回所有的 key-value 映射关系
boolean containsKey(Object key)判断是否包含 key
boolean containsValue(Object value)判断是否包含 value

注意:

  1. Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap
  2. Map中存放键值对的Key是唯一的,value是可以重复的。
  3. 在Map中插入键值对时,key不能为空,否则就会抛NullPointerException异常,但是value可以为空。
  4. Map中的Key可以全部分离出来,存储到Set中来进行访问(因为Key不能重复)。
  5. Map中的value可以全部分离出来,存储在Collection的任何一个子集合中(value可能有重复)。
  6. Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进行
    重新插入。
public static void main(String[] args) {
    Map<String,Integer> map = new TreeMap<>();
    map.put("sunny",3);
    map.put("the",5);
    map.put("hello",2);

    Integer val = map.get("the");
    Integer val1 = map.getOrDefault("the2",000);

    System.out.println(val);
    System.out.println(val1);


    Set<String> set = map.keySet();
    System.out.println(set);

    System.out.println("===========");

    Set<Map.Entry<String,Integer>> entrySet = map.entrySet();//将key和value看成一个整体
    for (Map.Entry<String,Integer> entry : entrySet){
        System.out.println("key: "+ entry.getKey() + "value: "+ entry.getValue());
    }
}

在这里插入图片描述

Set的说明

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

注意:

  1. Set是继承自Collection的一个接口类
  2. Set中只存储了key,并且要求key一定要唯一
  3. Set的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的
  4. Set最大的功能就是对集合中的元素进行去重
  5. 实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础
    上维护了一个双向链表来记录元素的插入次序。
  6. Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入
  7. Set中不能插入null的key。
public static void main(String[] args) {
    Set<String> set = new TreeSet<>();
    set.add("sunny");
    set.add("hello");
    set.add("the");
    System.out.println(set);
    Iterator<String> iterator = set.iterator();
    while (iterator.hasNext()){
        System.out.println(iterator.next());
    }
}

在这里插入图片描述

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

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

相关文章

CSS案例-5.margin产品模块练习

效果1 相关数据 整体长&#xff1a;298px&#xff0c;高&#xff1a;415px 效果2 知识点 外边距margin 块级盒子水平居中 条件&#xff1a; 必须有宽度左右外边距设为auto 三种写法&#xff1a; margin-left&#xff1a;auto&#xff1b;margin-right&#xff1a;auto&…

数据可视化-ECharts Html项目实战(3)

在之前的文章中&#xff0c;我们学习了如何创建堆积折线图&#xff0c;饼图以及较难的瀑布图并更改图标标题。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 …

服务器病毒木马通用排查处理应急响应流程

目录 一、勒索病毒发作的特征 二、勒索病毒的应急响应 三、勒索病毒预防与事后加固 一、勒索病毒发作的特征 如果发现大量统一后缀的文件&#xff1b;发现勒索信在Linux/home、/usr等目录&#xff0c;在Windows 桌面或者是被加密文件的文件夹下。如果存在以上特…

01|模型IO:输入提示、调用模型、解析输出

Model I/O 可以把对模型的使用过程拆解成三块&#xff0c;分别是输入提示&#xff08;对应图中的Format&#xff09;、调用模型&#xff08;对应图中的Predict&#xff09;和输出解析&#xff08;对应图中的Parse&#xff09;。这三块形成了一个整体&#xff0c;因此在LangCha…

【Ubuntu】Ubuntu的安装和配置

下载ubuntu镜像 https://releases.ubuntu.com/22.04.4/ubuntu-22.04.4-desktop-amd64.iso 一、Ubuntu安装 1.新建虚拟机 1.1按照它的提示创建用户&#xff1b;后面一直下一步就好 2.启动Ubuntu虚拟机 2.1设置为中文键盘 2.2默认即可&#xff1b;若是有低需求也可以选择最小…

YoloV8改进策略:Block改进|焦点调制网络

摘要 FocalNets是一个新型的神经网络架构&#xff0c;它的核心特点是用焦点调制模块完全取代了自注意力&#xff08;SA&#xff09;机制&#xff0c;用于在视觉任务中建模令牌&#xff08;token&#xff09;之间的交互。这种架构的设计旨在提高模型的可解释性&#xff0c;并在…

Tomcat:Session ID保持会话

目录 前言 ​一、部署环境 二、部署nginx反向代理服务器 三、部署tomcat服务器1 四、部署tomcat服务器2 五、客户端测试&#xff08;Session ID不断变动&#xff09; 六、配置Session ID会话保持 七、客户端测试&#xff08;Session ID保持&#xff09; 前言 此次实验…

拌合楼管理系统开发(六) 海康威视摄像头调用拍照

前言&#xff1a;无人值守过磅摄像头拍照 无人值守过程很重要的一个环节就是车辆过磅等车辆到到磅上指定位置后&#xff0c;触发车牌识别&#xff0c;以及车辆前后左右四个方位摄像头拍照&#xff0c;并存入到系统中。 一、支持设备&#xff1a; 建议都采用600万像素以上的海康…

jQuery+CSS3自动轮播焦点图特效源码

jQueryCSS3自动轮播焦点图特效源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 下载地址 jQueryCSS3自动轮播焦点图特效源码

javaweb day20

dml 写法 更新数据 写法 删除 写法

Java并发编程之ReactiveSteams

Reactive Steams 一、Reactive Steams介绍 在聊Reactive Steams之前&#xff0c;先了解一下Reactive Programming&#xff08;反应式/响应式编程&#xff09;。为了解决异步编程中出现的各种问题&#xff0c;程序员们提出了各种的思路去解决这些问题&#xff0c;这些解决问题…

docker init 生成Dockerfile和docker-compose.yml —— 筑梦之路

官网&#xff1a;https://docs.docker.com/engine/reference/commandline/init/ 简介 docker init是一个命令行实用程序&#xff0c;可帮助初始化项目中的 Docker 资源。.dockerignore它根据项目的要求创建 Dockerfile、Compose 文件。这简化了为项目配置 Docker 的过程&#…

Linux 文件系统:文件描述符、管理文件

目录 一、三个标注输入输出流 二、文件描述符fd 1、通过C语言管理文件—理解文件描述符fd 2、文件描述符实现原理 3、文件描述符0、1、2 4、总结 三、如何管理文件 1、打开文件的过程 2、内核空间的结构 struct task_struct&#xff08;PCB&#xff09; struct file…

html5播放flv视频

参考&#xff1a;flv-h265 - npmHTML5 FLV Player. Latest version: 1.7.0, last published: 6 months ago. Start using flv-h265 in your project by running npm i flv-h265. There are no other projects in the npm registry using flv-h265.https://www.npmjs.com/packag…

java类的定义及使用

1、类的定义 &#xff08;1&#xff09;类的重要性&#xff1a;是Java程序的基本组成单位&#xff1b; &#xff08;2&#xff09;类是什么&#xff1a;是对现实生活中一类具有共同属性和行为的事物的抽象&#xff0c;确定对象将会拥有的属性和行为&#xff1b; &#xff08…

卷积篇 | YOLOv8改进之C2f模块融合SCConv | 即插即用的空间和通道维度重构卷积

前言:Hello大家好,我是小哥谈。SCConv是一种用于减少特征冗余的卷积神经网络模块。相对于其他流行的SOTA方法,SCConv可以以更低的计算成本获得更高的准确率。它通过在空间和通道维度上进行重构,从而减少了特征图中的冗余信息。这种模块的设计可以提高卷积神经网络的性能。本…

AI时代,Matter如何融入与服务中国智能家居市场,助力中国企业出海?

随着智能家居产业的飞速发展&#xff0c;丰富多样的智能家居产品为消费者带来了便利的同时&#xff0c;因为不同品牌、不同产品之间的协议与标准不统一&#xff0c;导致消费者体验产生割裂&#xff0c;本来想买个“智能”家居&#xff0c;结果买了个“智障”家居&#xff0c;这…

C++开发基础——类对象与构造析构

一、基础概念 类&#xff1a;用户自定义的数据类型。 对象&#xff1a;类类型的变量&#xff0c;类的实例。 类的成员&#xff1a;成员变量和成员函数。 成员变量&#xff1a;类中定义的变量。 成员函数&#xff1a;类中定义的函数。 定义类的代码样例&#xff1a; class…

社区生活超市管理系统|基于JSP技术+ Mysql+Java+ Tomcat的社区生活超市管理系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

【Unity动画】Unity如何导入序列帧动画(GIF)

Unity 不支持GIF动画的直接播放&#xff0c;我们需要使用序列帧的方式 01准备好序列帧 02全部拖到Unity 仓库文件夹中 03全选修改成精灵模式Sprite 2D ,根据需要修改尺寸&#xff0c;点击Apply 04 创建一个空物体 拖动序列上去 然后全选所有序列帧&#xff0c;拖到这个空物体…