【JAVA入门】Day28 - 数据结构

【JAVA入门】Day28 - 数据结构


文章目录

  • 【JAVA入门】Day28 - 数据结构
    • 一、栈
    • 二、队列
    • 三、数组
      • 3.1 ArrayList
    • 四、链表
      • 4.1 LinkedList
    • 五、二叉树
      • 5.1 二叉查找树
      • 5.2 二叉树的遍历方式
      • 5.3 平衡二叉树
      • 5.4 平衡二叉树的旋转
      • 5.5 平衡二叉树需要旋转的几种情况
    • 六、红黑树
      • 6.1 红黑规则
      • 6.2 红黑树添加节点的规则


        数据结构就是计算机存储、组织数据的方式。它是指数据相互之间以何种方式排列在一起。数据结构是为了更加方便地管理和使用数据,需要结合具体的业务场景来进行选择。精心选择的数据结构可以给业务带来更高的运行或存储效率。

        常见的数据结构我们讲八种:

  • ① 栈
  • ② 队列
  • ③ 数组
  • ④ 链表
  • ⑤ 二叉树
  • ⑥ 二叉查找树
  • ⑦ 平衡二叉树
  • ⑧ 红黑树

        围绕三个问题,我们可以轻易学习:

1.每种数据结构长什么样子?
2.如何添加数据?
3.如何删除数据?

        学好数据结构是计算机进修的一大基础,下面我们从第一种开始讲起。

一、栈

        栈的特点:后进先出,先进后出
        数据进入栈模型的过程称为:压 / 进栈。
        我们以 A B C D 的顺序压栈,得到的结果如下图所示。
在这里插入图片描述
        此时的栈顶元素为 D,栈底元素为 A。
        数据离开栈模型的过程称为:弹 / 出栈。
        此时栈顶元素先出栈,所以只能按照 D C B A 的顺序依次出栈。
        在 Java 的内存结构当中,有一块区域被称为栈内存,也是利用了栈的原理。
在这里插入图片描述

二、队列

        队列的特点是:先进先出,后进后出
在这里插入图片描述
        A B C D 按顺序进入队列,会先从后端(队尾)依次进入,我们称之为入队列。随后,会按 A B C D 的顺序从前端(队头)依次出去,我们称之为出队列
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/5e7c9b85df0e436fa806d57d02aa32bf.png

在这里插入图片描述

三、数组

        数组也是一种数据结构,相关操作我们讲了很多了,不需要多讲。
在这里插入图片描述
        我们只需要知道,查询数据时,是通过数组的地址值索引直接定位的,查询任意数据耗时相同(因为元素在内存中是连续存储的)。
        数组的删除效率是非常低的,删除一个数据之后,要同时把后面每一个数据都前移。
在这里插入图片描述
在这里插入图片描述
        数组的添加效率也是非常低的,除非你在数组 0 索引前或最后索引后添加,否则中间插入元素需要把添加位置后的每个数据都往后移动,再插入元素。
在这里插入图片描述
        由此可见,数组是一种查询快,增删慢的数据模型。

3.1 ArrayList

        之前讲的 ArrayList 底层就是数组集合。

四、链表

        链表与数组刚好相反,它是一种查询慢,增删快的数据模型。
        链表中的每一个元素,我们有专业的名词来描述:结点(Node)。每一个结点都是一个独立的对象,它会有自身的存储位置(地址值),在结点内部,它还会存储具体的数据,同时也存储下一个结点的地址值。
在这里插入图片描述
        在链表中,第一个创建出来的结点,我们称为头结点,头结点里有自己的地址值,然后下一个结点地址值暂时记录为空。
在这里插入图片描述
        此时如果要添加一个数据A,我们就要新开辟一个新空间,存储数据A,然后将下一个结点地址值记录为空。
在这里插入图片描述
        然后我们只需要把前一个结点的“指向下一个结点地址值”的数据修改为新结点的地址值,即可完成两个结点之间的链接。
在这里插入图片描述
        从而我们可以创建一条完整的链表,内部的每一个结点都是一个独立的对象,在内存中是不连续的。
在这里插入图片描述
        因此,链表在查询时,无论查询哪个数据,都要从头结点开始找。
        但是,链表的增删是非常快的,每次增删不需要移动元素。当插入新结点时,只需要令上一个结点指向它,它的下一个结点指向原来的下一个结点,即可完成插入;删除也是一样的道理只需要断链把结点孤立出来,再清除它的内存空间即可。
        而且,链表还有双向的改进链表等,通过加入“上一个结点”的地址值,可以提高查找效率。

4.1 LinkedList

        LinkedList 在底层其实就是一个双向链表,它的特点是查询慢,增删快,但是如果操作的是首位元素,速度也是极快的。Java 给 LinkedList API 提供了很多独有方法,用于链表操作。

特有方法说明
public void addFirst(E e)在该列表开头插入指定的元素
public void addLast(E e)将指定的元素追加到此列表的末尾
public E getFirst()返回此列表中的第一个元素
public E getLast()返回此列表中的最后一个元素
public E removeFirst()从此列表中删除并返回第一个元素
public E removeLast()从此列表中删除并返回最后一个元素

五、二叉树

        二叉树是一种全新的数据结构。
在这里插入图片描述
        从根节点,向两边延伸出子节点,一个左子节点,一个右子节点,生生不息,延绵不绝。
        在 Java 中,实际上每个节点都是一个单独的对象,其内部存储着自身的值,还存储着父节点地址值、左子节点地址值、右子节点地址值,如果没有左右子节点,地址值就为空。
在这里插入图片描述
        在树的数据结构中,有一些专有名词需要认识。

  • 度:每一个节点的子节点数量。在二叉树中,任意节点的度<=2。
  • 树的高度:一棵树的总层数叫做树的高度。
    在这里插入图片描述
  • 根节点:最顶层的节点。
  • 左子节点:一个节点左下方的孩子节点。
  • 右子节点:一个节点右下方的孩子节点。
  • 根节点的左子树:如图所示。
    在这里插入图片描述
  • 根节点的右子树:如图所示。
    在这里插入图片描述
  • 其他节点的左右子树:如图所示。

在这里插入图片描述

5.1 二叉查找树

        如果一棵树的每一个节点都满足以下规律:它的左子节点的存储的数据比自己小,它的右子节点存储的数据比自己大,我们就把这棵树称为二叉查找树,又叫二叉排序树或二叉搜索树。
        二叉查找树在添加节点时一定要遵从以下规则:
1.小的存左边
2.大的存右边
3.一样的不存
在这里插入图片描述
        在查找时,从根节点开始,依次比较,如果比它小,看左边;比它大,看右边,依次摸索,直到找到或找不到。

5.2 二叉树的遍历方式

        二叉树有四种遍历方式:
①前序遍历
②中序遍历
③后序遍历
④层序遍历
        前序遍历:从根节点开始,按照当前节点,左子节点,右子节点的顺序遍历。
在这里插入图片描述
        中序遍历:从根节点开始,按照左子节点,当前节点,右子节点的顺序遍历。
        ※按照中序遍历的二叉排序树,其获取的数据是从小到大排列的。
在这里插入图片描述
        后序遍历:从根节点开始,按照左子节点,右子节点,当前节点的顺序遍历。
在这里插入图片描述
        层序遍历:从根节点开始,一层一层地遍历。
在这里插入图片描述

5.3 平衡二叉树

在这里插入图片描述

        如果严格按照二叉查找树的创建方式,可能会出现这种严重倾斜的情况,这样严重影响了查找的效率。一棵二叉树如果想要提高查找效率,那它的左右分支就应该差不多大,因此,我们需要引入平衡二叉树的概念。
在这里插入图片描述
        平衡二叉树是在二叉查找树的基础上,又加入了以下规则:任意节点左右子树的高度差不超过1

5.4 平衡二叉树的旋转

  • 平衡二叉树的左旋

        平衡二叉树在旋转时,要先确定支点,从添加的节点开始,不断地往父节点找不平衡的节点。
在这里插入图片描述
        所谓不平衡节点,就是左子树和右子树节点差值超过2的节点,可以轻易地发现图中是 10 节点,而 10 节点的左子树小于右子树,所以要进行左旋。
在这里插入图片描述
        这种简单左旋,旋转方式如下。
在这里插入图片描述
在这里插入图片描述
        稍微复杂一点的左旋,如下图所示:
在这里插入图片描述
        确认不平衡支点为 7 节点,左旋后如下:
在这里插入图片描述

  • 平衡二叉树的右旋

        平衡二叉树右旋,简单情况如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
        稍微复杂一点的情况,如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.5 平衡二叉树需要旋转的几种情况

  • 左左:当根节点左子树的左子树有节点插入,导致二叉树不平衡时。

在这里插入图片描述

在这里插入图片描述
此时进行右旋即可。
在这里插入图片描述

  • 左右:当根节点左子树的右子树有节点插入,导致二叉树不平衡时。

在这里插入图片描述
在这里插入图片描述
此时应该先对子树进行一次左旋,把情况变成左左,再进行整体的右旋。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 右右:当根节点的右子树的右子树有节点插入,导致二叉树不平衡时。
    在这里插入图片描述
    此时直接整体左旋即可。
    在这里插入图片描述
  • 右左:当根节点右子树的左子树有节点插入,导致二叉树不平衡时。
    在这里插入图片描述
    在这里插入图片描述
    应该先把局部位置进行右旋。
    在这里插入图片描述
    在这里插入图片描述
    此时变为右右,整体左旋即可。
    在这里插入图片描述

六、红黑树

        红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构。
        红黑树自1972年出现,曾被命名为平衡二叉B树,后于1978年被修改命名为红黑树
        红黑树是一种特殊的二叉查找树,它的每一个节点上都有存储位表示节点的颜色
        红黑树的每一个节点可以是或者,红黑树不是高度平衡的,它的平衡是通过红黑规则进行实现的。

在这里插入图片描述

6.1 红黑规则

① 每一个节点或者是红色,或者是黑色。
② 根节点必须是黑色。
③ 如果一个节点没有子节点或者父节点,则该节点相应指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的。
④ 如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况)。
⑤ 对每一个节点而言,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。
在这里插入图片描述
        如果一个节点没有左子节点,也没有右子节点,那么都记为Nil。
在这里插入图片描述
        然后会在它的两侧生成两个空节点,也就是叶子节点,其内部没有任何数据。

6.2 红黑树添加节点的规则

  • 默认颜色:添加的节点默认是红色的,因为红色节点添加效率高。使用红色节点造树,添加三个节点才需要调整一次这棵树。
  • 调整的规则如下图:
    在这里插入图片描述

        红黑树的增删改查,效率都是极高的。

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

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

相关文章

永成防回水防回气装置煤矿毫不犹豫选择

永成防回水防回气装置煤矿毫不犹豫选择&#xff0c;不敢说我们有多好&#xff0c;我们只把简单的事做好&#xff0c;用心服务&#xff0c;因为品质&#xff0c;所以信任。因为信任&#xff0c;所以值得选择。 本防回水防回气装置是一种用于煤矿瓦斯管路爆渣和燃烧时防止回火、…

3_1_PID控制原理

自从计算机进入控制领域以来&#xff0c;用数字计算机代替模拟计算机调节器组成计算机控制系统&#xff0c;不仅可以用软件实现PID控制算法&#xff0c;而且可以利用计算机的逻辑功能&#xff0c;使PID控制更加灵活。数字PID控制在生产过程中是一种最普遍采用的控制方法&#x…

[Algorithm][综合训练][奇数位丢弃][求和][计算字符串的编辑距离]详细讲解

目录 1.奇数位丢弃1.题目链接2.算法原理详解 && 代码实现 2.求和1.题目链接2.算法原理详解 && 代码实现 3.计算字符串的编辑距离1.题目链接2.算法原理详解 && 代码实现 1.奇数位丢弃 1.题目链接 奇数位丢弃 2.算法原理详解 && 代码实现 解法…

YOLOv9改进策略【损失函数篇】| 利用MPDIoU,加强边界框回归的准确性

一、背景 目标检测和实例分割中的关键问题&#xff1a; 现有的大多数边界框回归损失函数在不同的预测结果下可能具有相同的值&#xff0c;这降低了边界框回归的收敛速度和准确性。 现有损失函数的不足&#xff1a; 现有的基于 ℓ n \ell_n ℓn​范数的损失函数简单但对各种尺度…

Redis与SpringMVC的整合与最佳实践

整合Redis与Spring MVC&#xff08;现在通常是Spring Boot的一部分&#xff09;可以提高应用性能&#xff0c;特别是在处理大量数据缓存和会话状态管理方面。 下面是一些关于如何整合Redis与Spring MVC的最佳实践&#xff1a; 1. 引入依赖 首先&#xff0c;你需要在你的项目中…

【Java】Maven多环境切换实战(实操图解)

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容&#xff1a;三、问题描述四、解决方案&#xff1a;4.1 Maven多环境配置学习4.2 切换环境4.2.1 先打包4.2.2 之后可以切换 五、总结…

【ACM独立出版 | 厦大主办】第五届计算机科学与管理科技国际学术会议(ICCSMT 2024,10月18-20)

第五届计算机科学与管理科技国际学术会议(ICCSMT 2024) 定于2024年10月18-20日在中国厦门举行。 会议旨在为从事“计算机科学”与“管理科技”研究的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术&#xff0c;了解学术发展趋势&#xff0c;拓宽研究思路…

设计模式结构型模式之适配器模式

结构型模式之适配器模式 一、概述和使用场景1、概述2、使用场景&#xff1a;3、主要分类 二、 代码示例1、类适配器模式2、接口适配器3、对象适配器 四、总结1、适配器模式2、适配器模式的优点3、适配器模式的缺点 一、概述和使用场景 1、概述 适配器模式是一种结构型设计模式…

力扣面试经典算法150题:整数转罗马数字

整数转罗马数字 今天的题目是力扣面试经典150题中的数组的中等难度题&#xff1a; 整数转罗马数字。 题目链接&#xff1a;https://leetcode.cn/problems/integer-to-roman/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 七个不同的符号代表罗马…

SprinBoot+Vue餐厅点餐系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

stm32智能颜色送餐小车(ESP8266WIFI模块、APP制作、物联网模型建立、MQTTFX)

大家好啊&#xff0c;我是情谊&#xff0c;今天我们来介绍一下我最近设计的stm32产品&#xff0c;我们在今年七月份的时候参加了光电设计大赛&#xff0c;我们小队使用的就是stm32的智能送餐小车&#xff0c;虽然止步于省赛&#xff0c;但是还是一次成长的经验吧&#xff0c;那…

java在项目中实现excel导入导出

一、初识EasyExcel* 1. Apache POI 先说POI&#xff0c;有过报表导入导出经验的同学&#xff0c;应该听过或者使用。 Apache POI是Apache软件基金会的开源函式库&#xff0c;提供跨平台的Java API实现Microsoft Office格式档案读写。但是存在如下一些问题&#xff1a; 1.1 …

SpringBoot 项目——抽奖系统

本项目主要实现的功能是&#xff1a;主要服务于管理员用户&#xff0c;其可圈选奖品&#xff0c;人员来创建抽奖活动&#xff0c;并进行在线抽奖&#xff0c;并可通过短信或邮件的方式通知中奖者&#xff0c;同时普通用户可查看已结束的抽奖活动的中奖结果&#xff1b; 一、项…

TESSY创建单元测试或集成测试工程

我们以tessy5.1 IDE为例&#xff0c;给大家展示工程的创建过程。 1、打开TESSY5.1软件后&#xff0c;会弹出&#xff1a; 2、点击NEW Project后&#xff0c;会弹出&#xff1a; 3、接下来&#xff0c;就可以打开刚创建的工程&#xff1a; 4、进入到TESSY的主界面后&#xff0c…

Python办公自动化 获取文本数据 支持多种类型文件

学好办公自动化,走遍天下都不怕&#xff01;&#xff01; 前面我们已经学习了&#xff0c;如何用python的下载安装以及入门基础知识&#xff0c;并且也知道如何使用python自动处理Excel文件数据、如何批量生成Word文件、如何对数据分析后生成洞察报告、如何用python实现自动发送…

React中实现antd自定义图标,鼠标悬浮变色

借助 antd 的 tooltip 组件来实现 hover 时变色的效果 1.新建组件 自定义图标一般在iconfont上面获取&#xff0c;复制下来的svg代码&#xff0c;切记要删除 fill 属性后添加到组件中 import { Tooltip } from "antd"; import React from "react";const …

webpack4手动搭建Vue项目

小满视频 很多解释使用通义灵码搜的,通义灵码的搜索结果也是有错误的全程使用pnpm包管理工具&#xff0c;和npm的用法基本一样 学习总结 1. 多看看webpack官网 2. webpack的作用&#xff1a;配置一堆东西&#xff0c;达到运行程序的目的 3. 无论什么东西都转成js&#xff0c;…

理解数据库系统的内部结构

数据库系统在我们的数字世界中扮演着关键角色。本文将介绍数据库系统的内部结构&#xff0c;帮助初学者了解其基本概念。 数据库系统的三级模式 数据库系统内部采用三级模式二级映像结构&#xff0c;包括外模式、模式和内模式。这种结构确保了数据的逻辑独立性和物理独立性。…

如何在Android项目中进行性能优化分析?

引言 在开发过程中&#xff0c;性能优化是一个重要的话题。用户对于应用的性能有着非常高的期望&#xff1a;快速启动、流畅的操作体验、低内存消耗等。那么&#xff0c;作为开发者&#xff0c;我们如何才能在项目中进行性能优化分析呢&#xff1f;今天就来和大家聊聊这个话题…

Linux常见基础命令

Linux基础 初级学习阶段需要了解的知识一、Linux基础命令查阅命令帮助信息1.man2.help Linux命令的基本实用目录操作文件内容操作查看某文件下的用户操作日志压缩和解压缩sudo用户权限操作用户权限操作TOP文件安装 上一篇 VMware安装linux环境 初级学习阶段需要了解的知识 1.…