二叉搜索树(TreeMapTreeSet)

文章目录

    • 1.概念
    • 2.二叉搜索树的底层代码实现
      • (1)首先构建二叉树
      • (2)实现插入功能;
      • (3)实现查找
      • (4)删除(重点)
    • 3.TreeMap

1.概念

TreeMap&TreeSet都是有序的集合都是基于二叉搜索树来实现的
二叉搜索树:是一种特殊的二叉树
若左子树不为空,则左子树上的所有节点都小于根节点
若右子树不为空,则右子树上的所有节点都大于根节点
所有左右子树都满足这个条件
在这里插入图片描述

2.二叉搜索树的底层代码实现

(1)首先构建二叉树

 public class Node {public int val;public Node left;public Node right;public Node(int val) {this.val = val;}}public Node root;

(2)实现插入功能;

分两种情况树是否为空树
当子树为空树直接插入
当子树不为空按照条件限制进行插入
在这里插入图片描述

public void cha(int val) {Node cut = new Node(val);if (root == null) {root = cut;}Node cur = root;Node parter = null;while (cur != null) {if (cut.val > cur.val) {parter = cur;cur = cur.right;} else if (val == cur.val) {//如果树中已经含有val数据则直接退出return;} else {parter = cur;cur = cur.left;}}if (parter.val < cut.val) {//不能使用parter.left(right)!=null去判断两边都是null直接后续插入不了parter.right = cut;} else {parter.left = cut;}}

插入第一张图1~9测试一下

   public static void main(String[] args) {int []arr={5,3,4,1,7,8,2,6,0,9};BinarySearchTree binarySearchTree=new BinarySearchTree();for (int i=0;i< arr.length;i++){binarySearchTree.cha(arr[i]);}}

在这里插入图片描述
在这里插入图片描述

(3)实现查找

若根节点不为空
当根节点.val==val 返回true
当根节点.val>val 去左子树找
当根节点.val<val 去右子树找

 public boolean jc(int val) {Node cur = root;while (cur != null) {if (val < cur.val) {cur = cur.left;} else if (val > cur.val) {cur = cur.right;} else {return true;}}return false;}

在这里插入图片描述

(4)删除(重点)

设删除节点为cur,删除节点的双亲节点为parter
分三大方向
(一):当cur.left==null

1.当cur==root时root=root.right

2.cur!=null时
当parter.left==cur
parte.left=cur.right;

当parter.right==cur
parte.right=cur.right;

(二):当cur.right==null

1.当cur==root时root=root.left

2.cur!=null时
当parter.left==cur
parte.left=cur.left;

当parter.right==cur
parte.right=cur.left;
(三)cur.left!=null&&cur.right!=null
需要使⽤替换法进⾏删除,即在它的右⼦树中寻找中序下的第⼀个结点(关键码最⼩),⽤它的值填补到被删除节点中,再来处理该结点的删除问题

代码:

 public void remove(int val) {Node cut = new Node(val);Node cur = root;Node parter = null;while (cur != null) {if (cut.val > cur.val) {parter = cur;cur = cur.right;} else if (val < cur.val) {parter = cur;cur = cur.left;} else {delet(parter,cur);return;}}}public void delet(Node parter,Node cur){if(cur.right==null){if(cur==root){root=root.left;}if(parter.left==cur){parter.left=cur.left;}if(parter.right==cur){parter.right=cur.left;}}else if(cur.left==null){if(cur==root){root=root.right;}if(parter.left==cur){parter.left=cur.right;}if(parter.right==cur){parter.right=cur.right;}}else {Node target=cur.right;Node ptarget=cur;while (target.left!=null){ptarget=target;target=target.left;}cur.val=target.val;if(ptarget.left==target){ptarget.left=target.right;}else {ptarget.right=target.right;}}

在这里插入图片描述

3.TreeMap

MapMap是⼀个接⼝,不能直接实例化对象,如果要实例化对象可以实例化其实现类TreeMap

public static void main(String[] args) {Map<String ,Integer>map=new TreeMap<>();map.put("认知觉醒",68);map.put("西游记",66);map.put("骆驼祥子",58);System.out.println(map.get("认知觉醒"));//找到就返回对应的value没找到就返回所赋的默认值System.out.println(map.getOrDefault("红楼梦",0));//返回不重复的集合   根据key的大小进行排序System.out.println(map.keySet());map.put("西游记",44);//value可覆盖System.out.println(map.values());System.out.println(map.containsKey("被讨厌的勇气"));System.out.println(map.containsValue(55));//返回所key与value对应关系Map<String,Integer>map2=new TreeMap<>();String[]arr={"a","b","c","d","a","b","c"};for (String s:arr){if(!map2.containsKey(s)){map2.put(s,1);}else {int temp=map2.get(s);map2.put(s,temp+1);}}for (Map.Entry<String, Integer> entry:map2.entrySet()){System.out.println("该字母是"+entry.getKey()+"出现了"+entry.getValue()+"次");}}

在这里插入图片描述
在这里插入图片描述
4.TreeSet
Set继承Collection的接口类

  public static void main(String[] args) {//Set继承了Collection接口Set<String> set=new TreeSet<>();set.add("西游记");set.add("认知觉醒");set.add("骆驼祥子");set.add("西游记");//重复元素不被添加System.out.println(set.toString());System.out.println(set.contains("Sv"));//返回迭代器for (Iterator<String> iterator=set.iterator();iterator.hasNext();){String temp= iterator.next();System.out.println(temp);}System.out.println(set.size());System.out.println(set.isEmpty());int[]arr=new int[set.size()];for (int i = 0; i <set.size() ; i++) {System.out.println(set);}String []arr1={"西游记","认知觉醒","骆驼祥子","红楼梦"};//判断结合arr1中的元素在set中是否存在System.out.println(set.containsAll(Arrays.asList(arr1)));System.out.println();for (int i = 0; i <arr1.length ; i++) {//判断set中是否含有arr1[i]元素  且将set不含的元素添加进去System.out.println(set.addAll(Collections.singleton((arr1[i]))));}System.out.println(set.toString());set.remove("西游记");System.out.println(set.toString());//清空元素set.clear();System.out.println(set.toString());}

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【QT用户登录与界面跳转】

【QT用户登录与界面跳转】 1.前言2. 项目设置3.设计登录界面3.1 login.pro参数3.2 界面设置3.2.1 登录界面3.2.2 串口主界面 4. 实现登录逻辑5.串口界面6.测试功能7.总结 1.前言 在Qt应用程序开发中&#xff0c;实现用户登录及界面跳转功能是构建交互式应用的重要步骤之一。下…

基于springboot的口腔管理平台

作者&#xff1a;学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”&#xff0c;支持远程部署调试、运行安装。 项目包含&#xff1a; 完整源码数据库功能演示视频万字文档PPT 项目编码&#xff1…

4 AXI USER IP

前言 使用AXI Interface封装IP&#xff0c;并使用AXI Interface实现对IP内部寄存器进行读写实现控制LED的demo&#xff0c;这个demo是非常必要的&#xff0c;因为在前面的笔记中基本都需哟PS端与PL端就行通信互相交互&#xff0c;在PL端可以通过中断的形式来告知PS端一些事情&…

实力认证 | 海云安入选《信创安全产品及服务购买决策参考》

近日&#xff0c;国内知名安全调研机构GoUpSec发布了2024年中国网络安全行业《信创安全产品及服务购买决策参考》&#xff0c;报告从产品特点、产品优势、成功案例、安全策略等维度对各厂商信创安全产品及服务进行调研了解。 海云安凭借AI大模型技术在信创安全领域中的创新应用…

二、点灯基础实验

嵌入式基础实验第一个就是点灯&#xff0c;地位相当于编程界的hello world。 如下为LED原理图&#xff0c;要让相应LED发光&#xff0c;需要给I/O口设置输出引脚&#xff0c;低电平&#xff0c;二极管才会导通 2.1 打开初始工程&#xff0c;编写代码 以下会实现BLINKY常亮&…

Amazon MSK 开启 Public 访问 SASL 配置的方法

1. 开启 MSK Public 1.1 配置 MSK 参数 进入 MSK 控制台页面&#xff0c;点击左侧菜单 Cluster configuration。选择已有配置&#xff0c;或者创建新配置。在配置中添加参数 allow.everyone.if.no.acl.foundfalse修改集群配置&#xff0c;选择到新添加的配置。 1.2 开启 Pu…

大模型UI:Gradio全解11——Chatbot:融合大模型的聊天机器人(4)

大模型UI&#xff1a;Gradio全解11——Chatbot&#xff1a;融合大模型的聊天机器人&#xff08;4&#xff09; 前言本篇摘要11. Chatbot&#xff1a;融合大模型的多模态聊天机器人11.4 使用Blocks创建自定义聊天机器人11.4.1 简单聊天机器人演示11.4.2 立即响应和流式传输11.4.…

流量分析复现(第十八届信息安全大赛 第二届长城杯 )

zeroshell_1 题目&#xff1a;从数据包中找出攻击者利用漏洞开展攻击的会话&#xff08;攻击者执行了一条命令&#xff09;&#xff0c;写出该会话中设置的flag, 结果提交形式&#xff1a;flag{xxxxxxxxx} 这里大致的思路还是先看看&#xff0c;流量协议的分级 主要还是以TCP流…

ImportError: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32‘ not found

问题描述&#xff1a;安装MMYOLO或者MMROTATE时&#xff0c;出现的问题&#xff1a; (base) rootautodl-container-78fc438fda-4132d99a:~/autodl-tmp/MMROTATE_PROJECT/mmrotate-1.x# python demo/image_demo.py demo/demo.jpg oriented-rcnn-le90_r50_fpn_1x_dota.py orient…

2024年博客之星年度评选—创作影响力评审入围名单公布

2024年博客之星活动地址https://www.csdn.net/blogstar2024 TOP 300 榜单排名 用户昵称博客主页 身份 认证 评分 原创 博文 评分 平均 质量分评分 互动数据评分 总分排名三掌柜666三掌柜666-CSDN博客1001002001005001wkd_007wkd_007-CSDN博客1001002001005002栗筝ihttps:/…

25/1/15 嵌入式笔记 初学STM32F108

GPIO初始化函数 GPIO_Ini&#xff1a;初始化GPIO引脚的模式&#xff0c;速度和引脚号 GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA的引脚0 GPIO输出控制函数 GPIO_SetBits&#xff1a;将指定的GPIO引脚设置为高电平 GPIO_SetBits(GPIOA, GPIO_Pin_0); // 将GPIO…

新星杯-ESP32智能硬件开发--ESP32的I/O组成-系统中断矩阵

本博文内容导读&#x1f4d5;&#x1f389;&#x1f525; ESP32开发板的中断矩阵、功能描述与实现、相关API和示例程序进行介绍 ESP32中断矩阵将任一外部中断源单独分配到每个CPU的任一外部中断上&#xff0c;提供了强大的灵活性&#xff0c;能适应不同的应用需求。 ESP32中断主…

游戏引擎学习第81天

仓库:https://gitee.com/mrxiao_com/2d_game_2 或许我们应该尝试在地面上添加一些绘图 在这段时间的工作中&#xff0c;讨论了如何改进地面渲染的问题。虽然之前并没有专注于渲染部分&#xff0c;因为当时主要的工作重心不在这里&#xff0c;但在实现过程中&#xff0c;发现地…

【2024年华为OD机试】(C卷,100分)- 悄悄话 (Java JS PythonC/C++)

一、问题描述 题目描述 给定一个二叉树&#xff0c;每个节点上站一个人&#xff0c;节点数字表示父节点到该节点传递悄悄话需要花费的时间。 初始时&#xff0c;根节点所在位置的人有一个悄悄话想要传递给其他人&#xff0c;求二叉树所有节点上的人都接收到悄悄话花费的时间…

【Spring Boot】掌握 Spring 事务:隔离级别与传播机制解读与应用

前言 &#x1f31f;&#x1f31f;本期讲解关于spring 事务传播机制介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话…

【陕西省乡镇界】面图层shp格式arcgis数据乡镇名称和编码2020年wgs84坐标无偏移内容测评

标题中的“陕西省乡镇界面图层shp格式arcgis数据乡镇名称和编码2020年wgs84坐标无偏移.zip”表明这是一个地理信息系统&#xff08;GIS&#xff09;的数据集&#xff0c;专为陕西省的乡镇区域设计。该数据集以Shapefile&#xff08;shp&#xff09;格式提供&#xff0c;是GIS领…

国家统计局湖北调查总队副总队长张小青一行调研珈和科技农业遥感调查智能化算法

1月15日上午&#xff0c;国家统计局湖北调查总队党组成员、副总队长张小青一行莅临珈和科技开展调研。调研期间&#xff0c;张小青一行实地了解了珈和科技在自动化作物分布提取技术领域的最新成果&#xff0c;深入探讨了作物自动化处理模型在农业调查上应用的创新价值及优化方向…

-bash: /java: cannot execute binary file

在linux安装jdk报错 -bash: /java: cannot execute binary file 原因是jdk安装包和linux的不一致 程序员的面试宝典&#xff0c;一个免费的刷题平台

vue集成高德地图API实现坐标拾取功能

安装与配置&#xff1a; 组件 | vue-amapDescriptionhttps://elemefe.github.io/vue-amap/#/zh-cn/introduction/install简介 | vuemap/vue-amap简介https://vue-amap.guyixi.cn/zh-cn/introduction/introduction.html ​​​​我的应用 | 高德控制台高德开放平台官网控…

【大数据2025】Yarn 总结

分布式资源管理系统讲解总结 一、引言 围绕分布式资源管理系统展开&#xff0c;重点涵盖 Yarn 的简介、原理、资源调度策略以及运维和管理&#xff0c;旨在让学员全面掌握相关知识。Yet Another Resource Negotiator 二、Yarn 诞生背景 在 Hadoop 1.X 中仅有 HDFS 和 MapRe…