计算机基础--->数据结构(7)【红黑树】

news/2024/5/14 22:19:51/文章来源:https://blog.csdn.net/weixin_56781779/article/details/131553391

文章目录

  • 二三树
    • 二三树的性质
    • 二三树一个简单的插入例子
    • 二三树的特点
  • 红黑树
    • 红黑树的特点
    • 红黑树的节点
    • 红黑树的插入操作
      • 1. 左旋
      • 2. 右旋+颜色翻转
      • 3. 颜色翻转
      • 插入实例

二三树

二三树与红黑树的性质非常相似,但是二三树能更直观的让人理解构建过程

二三树的性质

二三树是一种自平衡的二叉搜索树,它的特点是每个节点可以存储一个或两个关键字以及相关的子结点链接,它的节点有两种类型2节点和3节点

  • 2节点:包含一个元素和两个子结点,左子节点的所有元素小于该节点,右子节点所有的元素大于该节点
  • 3节点:包含两个元素和三个子结点,左子节点的所有元素小于第一个元素,中子节点的所有元素在第一个和第二个元素之间,右子节点的所有元素大于第二个元素

二三树的主要优点是它能保持树的平衡,即所有的叶子节点都在同一层。这使得在二三树中查找、插入和删除操作的时间复杂度都是O(logN),其中N是树中的节点数量。

二三树一个简单的插入例子

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 如果树是空的,创建一个新的2节点
  2. 如果树不是空的,找到应该插入的叶子节点
  3. 如果叶子节点是2节点,插入该节点,使其成为3节点。
  4. 如果叶子节点是3节点,将该节点的元素一起重新分配到新的节点中,并将中间的元素移动到父节点中。如果父节点也是3节点,就递归地进行这个过程。

二三树的特点

二三树是一棵绝对平衡的树,即从根节点到任意一个叶子节点所经过的节点数都相同。

红黑树

红黑树是一种自平衡的二叉搜索树,它在插入和删除节点时通过重新排列节点来保持树的平衡,从而保证了查找、插入和删除操作的时间复杂度保持在O(logn)

红黑树的特点

红黑树的节点具有颜色属性,可以是红色或黑色。红黑树满足以下性质:

  1. 每个节点不是红色就是黑色
  2. 根节点是黑色的
  3. 每个叶子节点是黑色的
  4. 如果一个节点是红色的,那么它的子结点一定是黑色的
  5. 从一个节点到该节点的子孙节点的所有路径上包含相同数量的黑色节点

红黑树不一定是平衡二叉树,它只是平衡二叉树的一种。但是AVL树由于实现比较复杂,而且插入和删除性能差,在实际环境下的应用不如红黑树

红黑树的实际应用非常广泛,比如Linux内核中的完全公平调度器、高精度计时器、ext3文件系统等等,各种语言的函数库如Java的TreeMap和TreeSet等。

RBTree也是函数式语言中最常用的持久数据结构之一,在计算几何中也有重要作用。值得一提的是,Java 8中HashMap的实现也因为用红黑树取代链表,性能有所提升。

红黑树的节点

相较于AVL树,红黑树的节点中没有节点高度,但是添加了记录节点颜色。

    private class Node {int val;Node left;Node right;Boolean isRed;// 记录节点颜色public Node(int val) {this.val = val;this.left = this.right = null;this.isRed = true;}}

红黑树的插入操作

  1. 在插入结点时,我们始终认为插入这个结点之前,原来的红黑树是满足红黑树性质的,并且新插入的节点的颜色一定是红色,除了根节点。
  2. 新增的节点是红色的,这时候如果父亲节点也是红色的这时候就需要维护了。一共可以归纳出三种情况。
    // 向树中添加节点public void add(int val) {if (contains(val)) {return;}this.root = add(this.root, val);// 修改根节点颜色this.root.isRed = false;}// 向AVL树中添加节点private Node add(Node node, int val) {// 递归到底的情况if (node == null) {this.size++;return new Node(val);}// 递归操作if (node.val > val) {node.left = add(node.left, val);} else {node.right = add(node.right, val);}Node resultNode = node;if (!getNodeColor(node.left) && getNodeColor(node.right)) {resultNode = leftRotate(resultNode);}if (getNodeColor(resultNode.left) && getNodeColor(resultNode.left.left)) {resultNode = rightRotate(resultNode);}if (getNodeColor(resultNode.left) && getNodeColor(resultNode.right)) {flipColor(resultNode);}return resultNode;}

1. 左旋

在插入节点过程中,如果先插入42再插入37,这时直接就是右边没有问题的结构,但是如果先插入37,再插入42,这时可以看到红色节点出现在了右子树上,这在红黑树中是不允许的,这时候就需要进行左旋。

在这里插入图片描述

    // 左旋转private Node leftRotate(Node y) {Node x = y.right;Node leftX = x.left;x.left = y;y.right = leftX;// 更新颜色x.isRed = y.isRed;y.isRed = true;return x;}

2. 右旋+颜色翻转

在这里插入图片描述

    // 右旋转private Node rightRotate(Node y) {Node x = y.left;// 保存x的右子树Node rightX = x.right;// 将y作为x的右子树x.right = y;y.left = rightX;// 更新颜色x.isRed = y.isRed;y.isRed = true;return x;}// 颜色翻转private void flipColor(Node node) {node.isRed = true;node.left.isRed = false;node.right.isRed = false;}

3. 颜色翻转

在这里插入图片描述

    // 颜色翻转private void flipColor(Node node) {node.isRed = true;node.left.isRed = false;node.right.isRed = false;}

插入实例

在这里插入图片描述

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

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

相关文章

skywalking linux安装部署

SkyWalking APM tar 下载 结合自己的es版本下载对应的tar 地址:https://archive.apache.org/dist/skywalking/ 由于我使用的是es7所以下载对应版本 拷贝对应链接使用wget下载 wget https://archive.apache.org/dist/skywalking/8.7.0/apache-skywalking-apm-es7…

信息安全概述笔记

保密性、完整性、可用性是传统的信息安全的原则和目标,目前随着信息安全问题的日益严峻,信息安全的原则和目标衍生为诸如可控性、不可否认性等其他的原则和目标。 保密性(Confidentiality):确保信息只能由那些被授权使用的人获取…

【论文笔记】Skill-based Meta Reinforcement Learning

【论文笔记】Skill-based Meta Reinforcement Learning 文章目录 【论文笔记】Skill-based Meta Reinforcement LearningAbstract1 INTRODUCTION2 RELATED WORKMeta-Reinforcement LearningOffline datasetsOffline Meta-RLSkill-based Learning 3 PROBLEM FORMULATION AND PRE…

IDEA远程操作HDFS

IDEA远程管理HDFS 本地环境配置 Windows 解压到本地磁盘 配置环境变量 添加winutils.exe和hadoop.dll Hadoop本身对Windows的支持并不友好,如果需要完整使用,需要将winutils.exe和hadoop.dll两个文件移动到%HADOOP_HOME%\bin目录 修改hadoop-e…

MySQL的存储引擎与基本使用讲解

目录 一、前言 1.MySQL的介绍 二、存储引擎 1.什么是存储引擎 2.常见存储引擎 2.1.InnoDB(MySQL默认引擎) 2.1.1.四种隔离级别 2.2.MyISAM存储引擎 2.3.Memory存储引擎 3.ACID事务 三、CRUD操作 1.插入数据 2.查询数据 3.修改数据 4.删除数据 四、数据库 1.默认…

小白开酒吧前要知道的几个知识(四)

第七、岗位分工 酒吧一定要分工明确,各司其职。每一个岗位都有着自己的职责,每一个环节都有所关联,每天上班前需要提前安排好各岗位的工作。团队需要一个规章制度,毕竟没有规矩不成方圆,建立岗位相关的工作制度以及责…

html---链接跳转案例

目录 一、要求:设置一个网页如下图所示,可实现首页、列表页、详情页、登录页链接 二、实现:实现代码及截图如下 三、寄语 一、要求:设置一个网页如下图所示,可实现首页、列表页、详情页、登录页链接 二、实现&…

弃购邮件:用这一招帮您赢回失去的客户

弃购邮件:用这一招帮您赢回失去的客户 弃购邮件是发送给将产品添加至购物车却没有结算的顾客(即弃单顾客)的邮件。 这是一种十分有效的顾客留存策略。 在线客户放弃购物车的频率比您想象的要高。他们没有完成购买的原因有很多。但是&#xff…

创作神器:探索ai智能绘画软件的魅力与功能

曾经有一个名叫小艾的年轻画家,她对绘画充满热情,并梦想创作出令人惊叹的艺术作品。然而,她发现自己在技术和创意方面遇到了一些困难。正当她感到沮丧时,她听说了一个关于智能ai绘画软件的故事,这个软件据说能够通过机…

Springboot整合Activiti详解

文章目录 版本依赖配置文件需要注意的问题画流程图activiti服务类进行编写流程部署流程定义启动流程流程实例 测试流程启动流程完成任务受理任务 版本依赖 开发工具 IDEASpringBoot 2.4.5(这里我试过SpringBoot 3.1.1版本,Activiti没有启动,…

测试开发 —— 快速定位问题

写在前面 这两天工作实在是有点小忙,感觉好久没更新了,但是平时也是有感而发的比较多,今天遇到一个问题,感觉挺有意思,处理过程也非常有意义,希望能给大家一个借鉴吧。 测试平台又又又出问题了 今天一位…

一招教你看懂KMP算法next数组

给两个字符串,一个匹配串,一个主串,我们要在主串中找到第一个匹配串,并全部返回 eg: p"aba"; s"bbabaca"; 那么返回的就是第一个找到的匹配串的下标 返回2; 这里最容易想到的就是暴力匹配了,挨个,…

云原生(第四篇)-k8s yaml文件

Kubernetes 支持 YAML 和 JSON 格式管理资源对象 JSON 格式:主要用于 api 接口之间消息的传递 YAML 格式:用于配置和管理,YAML 是一种简洁的非标记性语言,内容格式人性化,较易读 YAML 语法格式: ●大小写敏…

还在用策略模式解决 if-else?Map+函数式接口方法才是YYDS!

本文介绍策略模式的具体应用以及Map函数式接口如何 “更完美” 的解决 if-else的问题。 需求 最近写了一个服务:根据优惠券的类型resourceType和编码resourceId来 查询 发放方式grantType和领取规则 实现方式: 根据优惠券类型resourceType -> 确定查…

open3D cmake+win10+vs2019编译

已经采用python版open3D实现和验证了功能,但是在C迁移上却遇到了不少问题: 1、可能是与本地的编译器存在差异,在使用open3D git上的winows版本时,存在地址访问冲突和std::bad_alloc等问题。前者在适用IO读写时必现,后者…

最小年龄仅5岁!盘点全球最“天才”少年黑客 TOP 10

你还能想起自己8岁的时候,每天都在玩什么吗?可能是在楼下和小朋友一起捉迷藏?在家追一本连载的漫画书?又或者在电脑上玩种菜偷菜的小游戏? 当同龄人还在沉迷于这些比较“基础”的小游戏时,有这样一批和互联…

Qt-事件(下)(事件过滤、自定义事件)

文章目录 事件过滤自定义事件 事件过滤 event()函数是一个protected的函数,这意味着我们要想重写event(),必须继承一个已有的组件类,——重写其event()函数。event()函数的确有一定的控制,不过有时候我的需求更严格一些&#xff…

完美适配小爱课程表(河南科技学院)

1.前言: 前文请参照我的以前的博客: 青果教务系统适配小爱课程表 本文代码现已开源: 小爱课程表适配gitee小爱课程表适配github 去年的时候试着适配了我们学校的小爱课程表,但是由于水平不够,直接把接口以及参数照搬&a…

react—Hook(2)

6. useMemo—似计算属性 useMemo和useCallback的作用十分类似,只不过它允许记住任何类型的变量(useCallback只记住函数)。当改变其他变量时,普通函数都会运行,它返回的结果并没有改变。这个时候就可以使用useMemo将函…