首页 > 编程语言 >Java笔记(数据结构与算法[树、栈、列表、队列、数组])

Java笔记(数据结构与算法[树、栈、列表、队列、数组])

时间:2024-12-19 13:28:17浏览次数:5  
标签:左子 结点 遍历 Java 队列 旋转 二叉树 数据结构 节点

Java笔记(数据结构与算法[树、栈、列表、队列、数组])

image-20230505112639534

链表

image-20230504132826189

栈 , 队列 , 数组

image-20230504133042826

  • 易错点 : 二叉树的插入 , 数据往二叉树里面插入的时候 , 每一个数据都要和每一个节点相比较 , 不可能插入到某两个节点中间 , 最后一定是挂(添加)到二叉树的最后一排的某个节点上

image-20230505113116379

image-20230505113129358

  • 度 : 每个结点子节点的数量
  • 二叉树 : 任意结点的度小于等于2
  • 树高 : 数的总层数image-20230510123028401
  • 根节点 : 最顶层的节点
  • 左子节点 : 左下方的节点
  • 普通结点也可以有左子树和右子树

image-20230505113446607

二叉查找树

定义
  • 又称二叉查找树或者二叉搜索树或者二叉排序树

image-20230505113822920

添加结点
  • 规则 :
    • 小的存左边
    • 大的存右边
    • 一样的不存

image-20230505114328247

image-20230505114337226

image-20230505114352002

查找节点
  • 上面的树查找5
    • 5先和7比较 ,小 ,那么应该在7左边 ,之后跟4比较 ,大 ,那么应该在右边 ,找到5
  • 上面的树查找12
    • 12先和7比较 ,大 ,再和10比较 ,大 ,再和11比较 ,大 ,和12比较 ,找到
  • 上面的树查找30
    • 一直查找发现到底层之后没有节点了 ,那么断定这棵树中没有30
二叉查找树的弊端
  • 如果数据比较有规律 , 都是从小到大或者从大到小排列 , 那么空间上排列方式有些不妥image-20230506102932030

  • 所以就有平衡二叉树

平衡二叉树

image-20230506103002427

  • 定义 : 任意节点的左右子树的高度差不超过一
    • 注意任意两个字 , 不能只看根节点
    • 例如下图 , 10结点 , 没有左子树 , 左子树高度是0 , 右子树高度是3

image-20230506103321963

image-20230506103500342

平衡二叉树的旋转机制
  • 平衡二叉树如何保持平衡 ? ------旋转机制

image-20230506104041954

  • 首先要确定支点 : 从添加的结点开始 , 不断往父节点找不平衡的点
左旋

在这里插入图片描述

例子一:

  • 旋转之前image-20230506104508647

  • 旋转之后image-20230506104531251

image-20230506104550620

例子二:

  • 旋转之前image-20230506104757588

  • 旋转之后

image-20230506104951145

右旋

在这里插入图片描述

例子一:

  • 旋转之前

image-20230506105532894

  • 旋转之后

image-20230506105559015

例子二:

  • 旋转之前

image-20230506105713390

  • 旋转之后

image-20230506105758922

平衡二叉树需要旋转的四种情况
左左—一次右旋

image-20230506110054907

image-20230506110120763

左右—先局部左旋 , 再整体右旋

image-20230506110311498

  • 只进行了一次右旋 , 发现仍然不平衡, 所以这种方法舍弃

image-20230506110328490

  • 正确解法 : 先把树进行局部左旋,注意左旋的部分并没有不平衡

image-20230506110311498

  • 将左右的情况变成左左

image-20230506110522450

  • 然后进行整体右旋

image-20230506110601151

右右—一次左旋

image-20230506110955098

image-20230506111017898

右左—先局部右旋 , 在整体左旋

image-20230506111239985

image-20230506111303436

image-20230506111316106

二叉树

二叉树的遍历

image-20230506102359909

  • 前序遍历(根遍历) , 中序遍历 , 后序遍历: 深度优先
  • 层序遍历 : 广度优先
前序遍历

image-20230505115149369

中序遍历(最常用)
  • 相当于把整个树压扁成一条线,这条线从前往后的顺序遍历

  • 先看跟结点有没有左子树 , 有 , 就从20走到18 , 然后在跟结点的左子树当中 , 是根据左中右遍历的image-20230505115355199image-20230505115407269

  • 最终结果

  • 这种方式的结果是从小到大排列的 , 所以也比较常用

image-20230505115518468

后序遍历

image-20230506101830301

层序遍历

image-20230506102313898

红黑树

  • 是一种自平衡的二叉查找树 , 是计算机科学中用到的一种数据结构

image-20230506112955242

image-20230506113117715

红黑规则
  • 左根右,根叶黑,不红红,黑路同
  • 每一个节点是红色或者黑色
  • 根节点必须是黑色
  • 叶节点必须是黑色的
  • 两个红色结点不能相连
  • 任意结点到所有后代叶节点的简单路径上, 黑色结点数量相同

image-20230506113414415

image-20230506113459601

  • 叶节点(叶子结点) : 被标为Nil的黑色结点 , ,用于判断当前红黑树是否满足规则

  • 某结点所有后代结点 : 就是这个节点的子树(左子树及右子树)上的所有节点(包括叶子结点)

    • 后代叶节点 : 就是后代(该节点的子树上的)的所有Nil
  • 简单路径 : 从某结点开始走 , 不能回头 , 一路走到底 , 只能往前

红黑树添加结点的规则
  • 默认颜色 : 添加结点默认颜色是红色的(效率高)

  • 以下为验证

  • 案例 : 添加以下三个黑色结点

image-20230506115632664

  • 下图违背了第五条规则

image-20230506115329859

image-20230506115556605

  • 案例 : 添加下面三个红色结点

image-20230506115841100

  • 因为第二条规定根节点必须是黑色的 , 所以这里直接把20变成黑色的

image-20230506115939665

  • 接下来比较18和20 , 发现18小于20 , 所以添加在20左子节点 , 发现这个操作并没有违背规则 , 那么继续添加23 , 发现添加在右子结点 , 整体也没有违背规则

image-20230506130101781

  • 第一个坑 : 叔叔是红色的 , 如果祖父非根 , 需要把祖父设置为当前结点在进行其他判断
  • 第二个坑 : 当前结点是父的右孩子 , 叔叔是黑色的 , 那么需要把父设置为当前结点 , 再进行判断
小结

image-20230506132435086

image-20230506132451424

  • 叔叔结点是同一个爷爷的子树上的节点 , 别的爷爷的子树上的节点和当前结点无关 , 例如下面的15, 19是叔叔 , 但是右边的22和24就不是image-20230506134755427

  • 同时注意旋转的时候不需要考虑叶子结点 , 先把叶子结点忽略 , 然后直接转image-20230506135408411

标签:左子,结点,遍历,Java,队列,旋转,二叉树,数据结构,节点
From: https://blog.csdn.net/weixin_73749601/article/details/144547675

相关文章

  • Java笔记(抽象类、接口、内部类、final关键字)
    Java笔记(抽象类、接口、内部类、final关键字)(一).抽象类抽象方法所在的类就是抽象类,抽象方法是在public和void中间加一个abstract,表示子类继承父类(父类是抽象类)的方法时必须重写,否则直接报错1.抽象方法和抽象类2.抽象类和抽象方法的定义格式3.抽象类和抽象方法的注意......
  • 云消息队列 MQTT 版
    云消息队列MQTT版是基于MQTT协议的云端消息队列服务,通常用于物联网(IoT)应用场景中。MQTT(MessageQueuingTelemetryTransport)是一种轻量级、基于发布/订阅模式的消息传输协议,专为低带宽、不稳定的网络和设备资源受限的环境设计。什么是MQTT协议?MQTT是一种简单的、开......
  • 轻量消息队列(原 MNS)
    轻量消息队列(原MNS),即消息通知服务(MessageNotificationService,MNS),是阿里云推出的一个高性能、低延迟、可扩展的消息队列服务。MNS适用于异步消息通信、解耦应用组件以及分布式系统中的任务调度等场景。在2023年,阿里云将MNS升级为轻量消息队列,并继续优化其性能和功能,......
  • 云消息队列 RabbitMQ 版
    云消息队列RabbitMQ版通常指的是在云平台上运行的RabbitMQ消息队列服务。这种服务提供了基于RabbitMQ的消息队列功能,并在云环境中提供高可用、可扩展的消息传递机制,适用于分布式系统中的异步通信和任务队列管理。什么是RabbitMQ?RabbitMQ是一个流行的开源消息队列中......
  • 数据结构:贪吃蛇详解
    目录一.地图的设计1.字符与坐标:2.本地化(头文件):3.类项:4.setlocale函数:(1)函数原型:(2)使用:5.宽字符的打印:(1)宽字符是什么:(2)打印:6.地图的实现和打印:(1)具体代码与预期实现效果:(2)解释:二.游戏逻辑与大体框架1.游戏逻辑与大体框架:2.游戏初步实现(GameStart函数):(1)欢迎界面......
  • Java项目整合Redis
    业务分析(思路)一个正常的业务操作是从前端到后端再到数据库,以商城的商品详情为例,当用户点击一个商品跳转进入详情页面时,从前端传入此商品的id,通过请求发至后端,后端接收该参数后即执行相应的方法,执行数据库sql操作。那么假定一个商城有十万或者数十万甚至更多的商品,那么商品数......
  • Java基础知识
    Java基础01.注释注释不会被执行!书写注释是一个非常好的习惯!!!平时写代码一定要注意规范!!Java中的注释有三种:单行注释多行注释文档注释具体操作代码如下:publicclassHelloWorld{publicstaticvoidmain(String[]args){//单行注释:只能注释一行文字......
  • Java如何用HaspMap统计次数并排序详解
    java统计单词频率继上一讲Java用PDFTextStripper来解析pdf文件提取文字-ivanlee717-博客园讲了如何接收和解析pdf之后,我们把pdf文件全部转为了String类型的字符串,那么这一讲聊聊怎么去统计每个词出现的频率。正则过滤首先我们需要把单词弄出来,把其他的文字过滤掉。Pattern......
  • JAVA健身房管理系统设计与实现
    大家好我是小俊学长,混迹在java圈的辛苦码农。今天要和大家聊的是一款《JAVA健身房管理系统设计与实现》毕业设计项目。项目源码以及部署相关请联系小俊学长,文末附上联系信息。......
  • (2024最新毕设合集)基于SpringBoot的社交型音乐网站+25664|可做计算机毕业设计JAVA、PHP
    目 录摘要1绪论1.1研究背景与意义1.3研究内容1.4论文结构与章节安排2 社交型音乐网站分析2.1可行性分析2.2系统流程分析2.2.1数据增加流程2.2.2数据修改流程2.2.3数据删除流程2.3 系统功能分析2.3.1功能性分析2.3.2非功能性分析2.4 ......