当前位置: 首页 > news >正文

学习JAVA的第十五天(基础)

目录

数据结构

二叉树

二叉查找树       

平衡二叉树

红黑树

Set系列集合  

HashSet集合

LinkedHashSet集合

TreeSet集合                       


 

          前言:学习JAVA的第十四天(基础)-CSDN博客

数据结构

二叉树

                                元素:结点(节点)

                                度:每个节点的子节点数量

                                二叉树:度<=2

                                树高:树的总层数                

                                根节点:最顶部的节点

                                左子结点:左下方的节点

                                右子节点:右下方的节点


二叉查找树       

特点:

                                每个节点最多有2个子节点       

                                任意节点左子树上的值小于当前节点 

                                任意节点右子树上的值大于当前节点         

添加节点:

                                  小的存左边、大的存右边、一样的不存

遍历方式:   

                                   ①前序遍历

                                   ②中序遍历

                                  ③ 后序遍历

                                  ④ 层序遍历

前序遍历  

                        从根节点开始,按照当前节点、子节点、子节点的顺序遍历

中序遍历

                        从最左边的子节点开始,按照子节点、当前节点、子节点的顺序遍历

后序遍历

                        从最左边的子节点开始,按照子节点、、子节点、当前节点的顺序遍历

层序遍历

                        从根节点开始,一层一层遍历


平衡二叉树

                          规则: 任意节点的左右子树高度差不超过1  

旋转机制

                        当添加一个节点时,该树不是一个平衡二叉树

左旋

                        确认支点:从添加的节点开始,不断的从父节点中找出不平衡的节点

                      步骤:不平衡节点作为支点。将支点左旋降级,变成左子节点。晋升原来的右子节点

右旋

                        确认支点:从添加的节点开始,不断的从父节点中找出不平衡的节点

                      步骤:不平衡节点作为支点。将支点右旋降级,变成右子节点。晋升原来的左子节点


红黑树

特征:

                        红黑树是一种自平衡的二叉树

                        每个节点可以是红或黑,红黑树不是高度平衡的,它的平衡是通过“红黑规则”实现

红黑规则:

 ①每个节点是红色或者是黑色

 ②根节点必须是黑色

  ③如果一个节点没有子节点或者父节点,则该节点的指针属性值为Nil,这些Nil会视为叶节点,每个叶节点是黑色

④如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连)

⑤对每一个节点,从该节点到其所有后代叶节点的简单路径.上,均包含相同数目的黑色节点

添加节点:

                        默认是红色(效率高)


Set系列集合  

特点: 

                                       无序:存取顺序不一致

                                        不重复:可以用来去重

                                      无索引:  不能用索引遍历元素

Set实现类:

  • HashSet:无序、不重复、无索引
  • LinkedHashSet:有序、不重复、无索引
  • TreeSet:可排序、不重复、无索引

Set集合遍历测试类

  public static void main(String[] args) {//创建Set集合对象 利用多态Set<String> s = new HashSet<>();//添加元素s.add("aaa");s.add("bbb");s.add("ccc");//打印集合System.out.print(s);//[aaa, ccc, bbb]//创建迭代器对象Iterator<String> it = s.iterator();while (it.hasNext()){System.out.print(it.next());//aaacccbbb}//增强for遍历for(String str : s) {System.out.print(str);//aaacccbbb}System.out.println();//利用Lambda表示式遍历s.forEach(new Consumer<String>() {@Overridepublic void accept(String str) {System.out.print(str);}});//简化Lambda表达式s.forEach(str -> System.out.print(str));//aaacccbbb}

HashSet集合

解释:底层是用哈希表存储数据的

哈希表:

                JDK8之前:数组+链表

                JDK8开始:数组+链表+红黑树

哈希值:对象的整数表现形式

  • 根据hashCode方法算出来的int类型整数
  • 该方法定义在Object中,所有对象都可以调用,默认使用地址值计算哈希值
  • 一般情况下,会重写hashCode方法,利用对象内部的属性值计算哈希值             

 测试类

 public static void main(String[] args) {//创建对象Student s1 = new Student("zhj",32);Student s2 = new Student("zhj",32);//哈希值System.out.println(s1.hashCode());//2133927002System.out.println(s2.hashCode());//1836019240}

LinkedHashSet集合

原理:底层数据结构依然是哈希表,只是每个元素又多了双链表的机制记录存储数据的顺序

测试类

 public static void main(String[] args) {//创建对象Student s1 = new Student("aaa",12);Student s2 = new Student("bbb",15);Student s3 = new Student("ccc",18);Student s4 = new Student("ddd",42);//创建集合的对象LinkedHashSet<Student> lhs = new LinkedHashSet<>();System.out.println(lhs.add(s3));//trueSystem.out.println(lhs.add(s2));//trueSystem.out.println(lhs.add(s1));//trueSystem.out.println(lhs.add(s4));//trueSystem.out.println(lhs);//[Student{name='ccc', age=18}, Student{name='bbb', age=15}, Student{name='aaa', age=12}, Student{name='ddd', age=42}]}

TreeSet集合                       

特点:可排序(默认情况按照从小到大排列)、无索引、不重复

实现:TreeSet集合底层是基于红黑树的数据结构进行排序的

测试类:

    public static void main(String[] args) {//创建TreeSet集合对象TreeSet<Integer>  ts = new TreeSet<>();//添加元素ts.add(4);ts.add(8);ts.add(1);ts.add(3);ts.add(2);//打印数据System.out.println(ts);//[1, 2, 3, 4, 8]//迭代器遍历Iterator<Integer>  it = ts.iterator();while(it.hasNext()){System.out.print(it.next());//12348}//增强for遍历for (Integer t : ts) {System.out.print(t);//12348}//实现类ts.forEach(new Consumer<Integer>() {@Overridepublic void accept(Integer integer) {System.out.print(integer);//12348}});//Lambda表达式简化ts.forEach(integer -> System.out.print(integer));//12348}

                        

     

相关文章:

  • 数组元组列表之间的相互转化
  • 揭秘大型集团背后的数据管理方法:如何掌控数据洪流,引领行业新潮流?
  • iOS开发进阶(八):ipa应用唤起并跳转至指定页面
  • 【三】【SQL Server】如何运用SQL Server中查询设计器通关数据库期末查询大题
  • 如何学习、上手点云算法(三):用VsCode、Visual Studio来debug基于PCL、Open3D的代码
  • 抖音详情API:音频和图片资源的管理与使用
  • 数据结构:顺序表的奥秘
  • pgrouting学习记录
  • 【图像拼接/视频拼接】论文精读:Efficient Video Stitching Based on Fast Structure Deformation
  • 8套成熟在用的三级医院信息化系统源码,HIS、LIS、PACS、智慧导诊、线上预约挂号支付系统源码
  • mongo基本使用
  • 已解决ResponseEntityException的Spring MVC异常响应实体异常的正确解决方法,亲测有效!!!
  • Vue.js 实用技巧:深入理解 Vue.mixin
  • ICVQUANTUMCHINA报告:《2024全球量子精密测量产业发展展望》
  • [本地跑项目总是要权限校验输密码]Error: EACCES: permission denied
  • 自己简单写的 事件订阅机制
  • [译] React v16.8: 含有Hooks的版本
  • 【mysql】环境安装、服务启动、密码设置
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • DataBase in Android
  • Elasticsearch 参考指南(升级前重新索引)
  • Flannel解读
  • HTTP那些事
  • input的行数自动增减
  • JavaScript学习总结——原型
  • JS题目及答案整理
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • pdf文件如何在线转换为jpg图片
  • Spring框架之我见(三)——IOC、AOP
  • tensorflow学习笔记3——MNIST应用篇
  • 百度小程序遇到的问题
  • 类orAPI - 收藏集 - 掘金
  • 理清楚Vue的结构
  • 普通函数和构造函数的区别
  • 前端相关框架总和
  • 听说你叫Java(二)–Servlet请求
  • 推荐一个React的管理后台框架
  • 学习使用ExpressJS 4.0中的新Router
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​linux启动进程的方式
  • #{}和${}的区别?
  • $jQuery 重写Alert样式方法
  • %@ page import=%的用法
  • (动态规划)5. 最长回文子串 java解决
  • (二)Linux——Linux常用指令
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (轉)JSON.stringify 语法实例讲解
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .NET : 在VS2008中计算代码度量值
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET 读取 JSON格式的数据
  • .NET 中什么样的类是可使用 await 异步等待的?