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

news2024/12/26 0:02:19

文章目录

  • 二三树
    • 二三树的性质
    • 二三树一个简单的插入例子
    • 二三树的特点
  • 红黑树
    • 红黑树的特点
    • 红黑树的节点
    • 红黑树的插入操作
      • 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.coloradmin.cn/o/721703.html

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

相关文章

【机器学习核心总结】什么是GBDT(梯度提升树)

什么是GBDT(梯度提升树) 虽然GBDT同样由许多决策树组成,但它与随机森林由许多不同。 其中之一是GBDT中的树都是回归树,树有分类有回归,区分它们的方法很简单。将苹果单纯分为好与坏的是分类树,如果能为苹果的好坏程度打个分&…

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

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

CentOS Linux的替代品(六)_BigCloud Enterprise Linux R8 U2 基础安装教程

文章目录 CentOS Linux的替代品(六)_BigCloud Enterprise Linux R8 U2 基础安装教程一、BC-Linux简介二、BigCloud Enterprise Linux R8 U2 基础安装2.1 下载地址2.2 安装过程 三、简单使用3.1 关闭selinux3.1.1 临时关闭selinux3.1.2 永久关闭selinux 3…

vscode 创建js 项目

1 创建 新窗口 2 进入文件夹 3 创建新的文件夹 4 选择 创建的文件夹 后 5 创建 js 文件 6 ctrl shift p 输入task 7 测试 8 F5 运行 选择调试器

打造品牌影响力:媒介易引领邀请明星录制祝福视频新潮流

在当今品牌推广的竞争激烈市场中,与体育冠军合作代言已成为众多品牌争相追求的新形式。体育冠军以其卓越的成就和广泛的影响力,成为品牌推广中的瞩目焦点。他们的形象和声音能够深入人心,激发消费者的共鸣,并对品牌产生积极的影响…

Mysql 幻读,当前读和快照读

什么是幻读 幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户在读取该范围的数据行时,会发现有新增行数据; mysql 在RR(可重复读)隔离级别利用间隙锁机制下一定程度上解决了幻读。 这里的一定程度…

Echarts 柱状图 设置柱状图渐变,设置柱状图圆角(弧度)

Echarts 柱状图 设置柱状图渐变,设置柱状图圆角(弧度) 1. 效果截图 2. 配置项截图 3. 具体代码 import * as echarts from echarts// 项目组织项目数 const territoryOptions {key: territory,title: {text: 项目数,textStyle: {fontSize:…

数据库死锁:原因和解决办法

理解数据库中的死锁 在数据库的上下文中,死锁是指两个或多个事务无法进行的情况,因为每个事务都在等待另一个事务释放资源。这可以类比为事务的循环链,每个事务都在等待链中的下一个事务释放资源。以下是一个死锁场景的视觉表示:…

Spring Boot 中的端点是什么,如何使用

Spring Boot 中的端点是什么,如何使用 Spring Boot 是一款流行的 Java Web 应用程序框架,它的设计目标是使开发人员可以更快速地创建和部署 Web 应用程序。Spring Boot 通过自动配置和约定大于配置的方式,使得开发人员可以专注于业务逻辑而不…

Spring面试题--SpringMVC的执行流程

Springmvc的执行流程是这个框架最核心的内容 视图阶段(老旧JSP等) 前后端分离阶段(接口开发,异步) 视图阶段(老旧JSP等) 1当请求放出,前端控制器接收请求,他相当于一个…

7月7日发布?OPPO A78 4G手机跑分库曝光

据报道,OPPO计划在7月7日发布A78 4G手机。在正式发布之前,该手机已经在GeekBench跑分库中出现。根据GeekBench 6.1版本,A78 4G单核成绩为411分,多核成绩为1263分。 跑分页面显示 OPPO A78 4G 型号为 CPH2565,主板代号为…

第四十章Java装箱拆箱机制

Java中的基本数据类型不是对象型(引用类型)。但是在程序中有时需要对对象而不是基本数据类型进行操作。因此,java里提供了一种叫做包装类(wrapper),它能够把基本数据类型包装成对象类型。 Java中的包装器类有两个主要的作用 1&a…

11、架构:CI/CD 设计

本章内容是基于 DevOps 体系的精简版本,如果有阅读过之前 DevOps 小册的同学,可以快速掠过。 开局先放一张镇楼图,上图我在行云集团做的通用型 CI/CD 解决方案 ALL IN DOCKER,所有的操作构建与发布过程都在 Docker 中操作。 但很…

java进阶3:GC 的背景与一般原理

目录 为什么会有GC 背景: 理解: 可达性分析算法 基本思路: 标记清除算法 ​讲解 一 点睛 二 执行过程 三 什么是清除 四 缺点 STW 对象与分代 GC时对象在内存池中的迁移 GC Roots 总结 默认算法 标记-清除算法(…

OpenCV创建一张类型为CV_8UC4的4通道图像

#include <iostream> #include <opencv2/imgcodecs.hpp> #include <opencv2/opencv.hpp> #include <opencv2/highgui.hpp>int m

Openlayers实战:自定义版权属性信息

Openlayers地图中,通常会展示地图的一个版权信息,这里面涉及到地图层的版权信息内容,还涉及到control中的Attribution的设置,本实战示例中,通过灵活的属性配置,显示了还是大剑师兰特的博客版权信息,点击是可以跳转的。 效果图 源代码 /* * @Author: 大剑师兰特(xiaoz…

【新版系统架构】第十二章-信息系统架构设计理论和实践

软考-系统架构设计师知识点提炼-系统架构设计师教程&#xff08;第2版&#xff09; 第一章-绪论第二章-计算机系统基础知识&#xff08;一&#xff09;第二章-计算机系统基础知识&#xff08;二&#xff09;第三章-信息系统基础知识第四章-信息安全技术基础知识第五章-软件工程…

2023年SCI影响因子(JCR2022)正式公布

2023年6月28日&#xff0c;Clarivate Analytics&#xff08;科睿唯安&#xff09;发布最新的《期刊引证报告》&#xff08;Journal Citation Reports&#xff0c;简称JCR&#xff09;&#xff0c;刷新SCI期刊2022年影响因子(IF)。该指数也备受访问学者、联培博士及博士后研究者…

Centos7安装编译ffmpeg到指定目录

1、官网下载tar包 https://ffmpeg.org/download.html 2、解压usr/local目录 3、编译准备 cd ffmpeg-6.0 # 切换到ffmpeg-6.0目录 yum install gcc # 安装gcc编译器 yum install yasm # 安装yasm编译器 4、安装设置 ./configure --enable-shared --prefix/usr/local/ffmp…

AI 对抗超级细菌:麦克马斯特大学利用深度学习发现新型抗生素 abaucin

内容一览&#xff1a;鲍曼不动杆菌是一种常见的医院获得性革兰氏阴性病原体&#xff0c;通常表现出多重耐药性。利用传统方法&#xff0c;发现抑制此菌的新型抗生素很困难。但利用机器学习可以快速探索化学空间&#xff0c;从而增加发现新型抗菌分子的可能性。近期&#xff0c;…