【数据结构】搜索树MapSet

news2024/9/29 21:23:43

目录

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和情况2
        if(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.coloradmin.cn/o/984295.html

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

相关文章

Linux CentOS7命令及命令行

Linux CentOS7中命令及命令行是非常重要的概念。对大多数初学者来说是既熟悉又了解甚少。本文初步讨论这方面的内容&#xff0c;与同行者交流。 一、命令 命令又称为指令&#xff0c;&#xff08;英语命令 command&#xff0c;可用简写cmd表示&#xff09;&#xff0c;在终端…

爬虫逆向实战(30)-某查查股东关联公司(HmacSHA512)

一、数据接口分析 主页地址&#xff1a;某查查 1、抓包 通过抓包可以发现数据接口是api/people/getRelatCompany 2、判断是否有加密参数 请求参数是否加密&#xff1f; 无 请求头是否加密&#xff1f; 通过查看“标头”可以发现&#xff0c;请求头中有一个key和value都是…

怎么把视频转换成mp4格式

怎么把视频转换成mp4格式&#xff1f;如今&#xff0c;随着科技的不断发展&#xff0c;我们在工作中接触到的多媒体视频格式也越来越多。其中&#xff0c;MP4作为一种广泛兼容的视频格式&#xff0c;在许多软件中都能轻松播放&#xff0c;并且成为了剪辑与裁剪视频时大家常用的…

视频画质修复神器,视频修复专家告诉你怎样提高画质

如果您的视频画质模糊、失真或者过于昏暗&#xff0c;那么本文将给大家分享一个非常实用的视频修复技巧。利用一些工具增强视频细节和清晰度的高级技术&#xff0c;向您呈现最详细的视频修复教程。 修复视频画质的话也可以使用去噪滤镜和锐化滤镜。 调整视频分辨率:将视频的分…

【图文并茂】c++介绍之队列

1.1队列的定义 队列&#xff08;queue&#xff09;简称队&#xff0c;它也是一种操作受限的线性表&#xff0c;其限制为仅允许在表的一端进行插入操作&#xff0c;而在表的另一端进行删除操作 一些基础概念&#xff1a; 队尾&#xff08;rear&#xff09; &#xff1a;进行插…

C++-map和set

本期我们来学习map和set 目录 关联式容器 键值对 pair 树形结构的关联式容器 set multiset map multimap 关联式容器 我们已经接触过 STL 中的部分容器&#xff0c;比如&#xff1a; vector 、 list 、 deque 、forward_list(C11)等&#xff0c;这些容器统称为序列式…

为何电商界都重视社交媒体客户服务软件

如今&#xff0c;几乎每个企业都有自己的像Facebook、WhatsApp和telegram等社交媒体渠道&#xff0c;客户可以利用这些渠道找到产品相关内容&#xff0c;发现有关产品或服务的其他信息&#xff0c;并接收有用的优惠和特别优惠。然而&#xff0c;真正成功的电子商务公司仅仅拥有…

element-plus 表格-自定义样式实现

效果如下 代码如下 <template><h2>表格自定义样式</h2><div style"background-color: cadetblue; height: 600px;"><div class"regulaContainer"><el-table ref"tableRef" :data"tableData" border …

Spring 自定义注解 面向切面编程

Spring 自定义注解 JDK元注解规范 Documented -注解是否将包含在JavaDoc中 Retention -什么时候使用该注解(生命周期)RetentionPolicy.SOURCE: 在变异阶段丢弃&#xff0c;这些注解在编译结束之后就不再有任何意义&#xff0c;所以不会写入到字节码中RetentionPolicy.CLASS:…

2023年数学建模国赛A 定日镜场的优化设计思路分析

构建以新能源为主体的新型电力系统&#xff0c;是我国实现“碳达峰”“碳中和”目标的一项重要措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。定日镜是塔式太阳能光热发电站&#xff08;以下简称塔式电站&#xff09;收集太阳能的基本组件&#xff0c;其底座由…

【算法训练-字符串 三】最长公共子串、最长公共子序列

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【】&#xff0c;使用【】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&#xff1a;目标公…

Promise异步请求/async-await

问题&#xff1a;调接口时&#xff0c;非以往的函数异步请求去调接口。而是用到了Promise中.then方法 Promise Promise是一种用于处理异步操作的对象。它代表了一个尚未完成但预计会未来完成的操作&#xff0c;并提供了一种结构化的方式来处理操作的结果。它起到代理作用&…

合宙Air724UG LuatOS-Air LVGL API控件-键盘 (Keyboard)

键盘 (Keyboard) LVGL 可以添加触摸键盘&#xff0c;但是很明显&#xff0c;使用触摸键盘的话必须要使用触摸的输入方式&#xff0c;否则无法驱动键盘。 示例代码 function keyCb(obj, e)-- 默认处理事件lvgl.keyboard_def_event_cb(keyBoard, e)if(e lvgl.EVENT_CANCEL)the…

后流量时代的跨境风口:Facebook广告

Facebook拥有超过25亿各个年龄段和人群的每月活跃用户&#xff0c;可以帮助您接触世界各地的相关消费者。无论您是需要吸引新的潜在客户还是吸引回头客访问您的在线商店&#xff0c;Facebook广告都可以为电子商务提供丰厚的投资回报&#xff1b;无论您是在沃尔玛、eBay、亚马逊…

Spring-MVC的crud增删改查--详细讲解

目录 一.前言 二.crud---配置文件 2.1 pom.xml文件 2.2 web.xml文件 2.3 spring-context.xml 2.4 spring-mvc.xml 2.5 spring-MyBatis.xml 2.6 jdbc.properties数据库配置文件 2.7 generatorConfig.xml 2.8 日志文件log4j 三.后台 3.1 pageBean.java 3.2 pageTag 3.…

进军公有云这一年,OceanBase做了什么

*本文转载自微信公众号“机器之心&#xff0c;ID&#xff1a;almosthuman2014” 如今&#xff0c;数据库市场正在迈入新的竞争阶段——一场云上的角逐。 2022 年&#xff0c;中国公有云数据库市场规模首次过半[1]&#xff0c;预计未来占比将进一步扩大。许多中国的数据库厂商也…

新能源商用车软件开发设计规范

目 录 前 言.............................................................................................................. 1 1 范围............................................................................................................... 2 2 规范性…

用HexView 观察编译后的机器代码

HexView 用于打开任意一个文件&#xff0c;以十六进制的形式从头到尾显示它每个字节的内容。 下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1zB9r5WwuTMIPNMlYl5HlvA 提取码&#xff1a;5ndl双击启动 HexView&#xff0c;然后选择菜单“文件”-“打开文件以显…

专业游戏翻译公司怎么选择比较合适

近年来&#xff0c;游戏行业持续繁荣&#xff0c;市场需求也在不断扩大&#xff0c;其中游戏翻译的需求越来越旺盛。无论是引进游戏还是让游戏走向国际市场&#xff0c;都需要专业的翻译公司来帮忙。那么&#xff0c;怎么选择合适的游戏翻译公司呢&#xff1f;让我们一起来看看…

jmeter 准确的吞吐量定时器 Precise Throughput Timer

准确的吞吐量定时器使用实例 提取码&#xff1a;gpex&#xff1a; 说明&#xff1a;配置10个线程&#xff0c;每个线程请求200次&#xff0c;通过准确地屯托梁定时器模拟QPS为20的场景 配置测试接口参考链接 配置jmeter测试脚本&#xff0c;主要关注准确的吞吐量定时器参数配置…