数据结构和算法(九)--红黑树

一、红黑树

1、红黑树

    前面介绍了2-3树,可以看到2-3树能保证在插入元素之后,树依然保持平衡状态,它的最坏情况下所有子结点都是2-结点,树的高度为IgN,相比于我们普通的二叉查找树,最坏情况下树的高度为N,确实保证了最坏情况下的时间复杂度,但是2-3树实现起来过于复杂,所以我们介绍一种2-3树思想的简单实现:红黑树
    红黑树主要是对2-3树进行编码,红黑树背后的基本思想是用标准的二叉查找树(完全由2-结点构成)和一些额外的信息(替换3-结点)来表示2-3树。我们将树中的链接分为两种类型:
        红链接:将两个2-结点连接起来构成一个3-结点,

        黑链接:则是2-3树中的普通链接。
    确切的说,我们将3-结点表示为由由一条左斜红色链接(两个2-结点其中之一是另一个的左子结点)相连的两个2-结点。这种表示法的个优点是,我们无需修改就可以直接使用标准的二叉查找树的get方法。

1.1、红黑树的定义

红黑树是含有红黑链接并满足下列条件的二叉查找树:
    1、红链接均为左链接;
    2、没有任何一个结点同时和两条红链接相连;
    3、该树是完美黑色平衡的,即任意空链接到根结点的路径上的黑链接数量相同;
下面是红黑树与2-3树的对应关系:

1.2、红黑树结点API

    因为每个结点都只会有一条指向自己的链接(从它的父结点指向它),我们可以在之前的Node结点中添加一个布尔类型的变量color来表示链接的颜色。如果指向它的链接是红色的,那么该变量的值为true,如果链接是黑色的,那么该变量的值为false。

API设计:

类名Node<Key,Value>
构造方法Node(Key key, Value value, Node left, Node right , boolean color):创建Node对象
成员变量1.public Node left:记录左子结点
2.public Node right:记录右子结点
3.public Key key:存储键
4.public Value value:存储值
5.public boolean color:由其结点指向它的链接的颜色

代码:

public class Node<Key, Value> {//存储键public key key;//存储值private value value;//记录左子结点public Node left;//记录右子结点public Node right;//由其父结点指向它的链接的颜色public boolean color;public Node(Key key, Value value, Node left, Node right, boolean color) {this.key = key;this.value = value;this.left = left;this.right = right;this.color = color;}
}

1.3、平衡化

    在对红黑树进行一些增删改查的操作后,很有可能会出现红色的右链接或者两条连续红色的链接,而这些都不满足红黑树的定义,所以我们需要对这些情况通过旋转进行修复,让红黑树保持平衡

1.3.1、左旋

    当某个结点的左子结点为黑色,右子结点为红色,此时需要左旋

前提:当前结点为h,它的右子结点为x;

左旋过程:
    1、让x的左子结点变为h的右子结点:h.right=x.left;
    2、让h成为x的左子结点:x.left=h;
    3、让h的color属性变为x的color属性值:x.color=h.color;
    4、让h的color属性变为RED:h.color=true;

1.3.2、右旋

    当某个结点的左子结点是红色,且左子结点的左子结点也是红色,需要右旋。

前提:当煎结点为h,它的左子结点为x;

右旋过程:
    1、让x的右子结点成为h的左子结点:h.left=x.right;
    2、让h成为x的右子结点:x.right=h;
    3、让x的color变为h的color属性值:x.color =h.color;
    4、让h的color为RED ;

数据结构和算法(一)

数据结构和算法(八)--2-3查找树

数据结构--栈、队列、链表、散列表、排序二叉树

再小的努力,乘以365都很明显!
每天⽤⼼记录⼀点点。内容也许不重要,但习惯很重要!
一个程序员最重要的能力是:写出高质量的代码!!
有道无术,术尚可求也,有术无道,止于术。
无论你是年轻还是年长,所有程序员都需要记住:时刻努力学习新技术,否则就会被时代抛弃!

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

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

相关文章

工业摄像头通过USB接口实现图像

工业摄像头系列概览&#xff1a;类型与应用 工业摄像头系列涵盖了多种类型&#xff0c;以满足不同行业和应用的需求。以下是对工业摄像头系列的一些介绍&#xff1a; 一、主要类型与特点 USB工业摄像头 &#xff1a;这类摄像头通常通过USB接口与计算机连接&#xff0c;适用于…

使用Django框架表单

使用Django框架表单 文章目录 使用Django框架表单[toc]1.使用Form类构建表单2.表单字段与Widget控件 1.使用Form类构建表单 【创建项目和应用】 PS C:\Users\ls> cd E:\Python\ PS E:\Python> django-admin.exe startproject FormSite PS E:\Python> cd .\FormSite\…

docker配置mysql遇到的问题:网络连接超时、启动mysql失败、navicat无法远程连接mysql

目录 1.网络超时 方式1. 网络连接问题 方式2. Docker镜像源问题 方式3.使用国内镜像源 2.启动mysql镜像失败 3.navicat无法远程连接mysql 1.网络超时 安装MySQL时出现超时问题&#xff0c;可能由多种原因导致&#xff1a; 方式1. 网络连接问题 原因&#xff1a;网络不稳定…

React 多语言国际化:实现多语言支持

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

Claude系列模型-20250426

文章目录 Claude 3.7 Sonnet - "Our most intelligent model yet"Claude 3.5 Haiku - "Fastest model for daily tasks"Claude 3.5 Sonnet (Oct 2024)Claude 3 Opus总结Claude 3.7 Sonnet - “Our most intelligent model yet” 特点: 这是目前Claude系列…

Linux查看可用端口号码命令

在Linux系统中&#xff0c;有多种命令可用于查看可用端口号码&#xff0c;下面为你详细介绍&#xff1a; 1. 使用netstat命令 netstat是一个功能强大的网络工具&#xff0c;可用于显示网络连接、路由表和网络接口等信息。你可以结合不同的选项来查看端口使用情况。 查看所有…

leetcode201.数字范围按位与

找到公共前缀部分&#xff0c;然后后面的部分全0 class Solution {public int rangeBitwiseAnd(int left, int right) {int offset 0;while (left ! right) {offset;left left >> 1;right right >> 1;}return right << offset;} }

端到端自动驾驶的数据规模化定律

25年4月来自Nvidia、多伦多大学、NYU和斯坦福大学的论文“Data Scaling Laws for End-to-End Autonomous Driving”。 自动驾驶汽车 (AV) 栈传统上依赖于分解方法&#xff0c;使用单独的模块处理感知、预测和规划。然而&#xff0c;这种设计在模块间通信期间会引入信息丢失&am…

021-C语言文件操作

C语言文件操作 文章目录 C语言文件操作1. 文件的概念2. 二进制文件和文本文件3. 文件的打开和关闭3.1 流和标准流3.1.1 流3.1.2 标准流 3.2 文件指针3.3 文件的打开和关闭 4. 文件的顺序读写4.1 顺序读写函数4.2 对比两组函数4.2.1 scanf/fscanf/sscanf4.2.2 printf/fprintf/sp…

如何使用@KafkaListener实现从nacos中动态获取监听的topic

1、简介 对于经常需要变更kafka主题的场景&#xff0c;为了实现动态监听topic的功能&#xff0c;可以使用以下方式。 2、使用步骤 2.1、添加依赖 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactI…

《TCP/IP详解 卷1:协议》之第七、八章:Ping Traceroute

目录 一、ICMP回显请求和回显应答 1、ICMP回显请求 2、ICMP回显应答 二、ARP高速缓存 三、IP记录路由选项&#xff08;Record Route&#xff0c;RR&#xff09; 1、记录路由选项的工作过程 2、RR 选项的 IP 头部格式 2.1、RR 请求 2.2、RR响应 四、ping 的去返路径 五…

30天通过软考高项-第四天

30天通过软考高项-第四天 任务&#xff1a;项目进度管理 思维导图阅读 知识点集锦阅读 知识点记忆 章节习题练习 知识点练习 手写回忆ITTO 听一遍喜马拉雅关于范围的内容 进度管理-背 1. 过程定义 龟腚排池至控 规划进度管理&#xff1a;为了规划、编制、管理…

根据JSON动态生成表单表格

根据JSON动态生成表单表格 一. 子组件 DynamicFormTable.vue1,根据JSON数据动态生成表单表格,支持表单验证JS部分1.1,props数据1.2,表单数据和数据监听1.3,自动验证1.4,表单验证1.5,获取表单数据1.6,事件处理1.7,暴露方法给父组件2,HTML部分二,父组件1, 模拟数据2,…

【赵渝强老师】快速上手TiDB数据库

从TiDBv4.0起&#xff0c;提供了包管理工具TiUP&#xff0c;负责管理TiDB、PD、TiKV等组件。用户只需通过TiUP命令即可运行这些组件&#xff0c;显著降低了管理难度。TiUP程序只包含少数几个命令&#xff0c;用来下载、更新、卸载组件。TiUP通过各种组件来扩展其功能。组件是一…

springboot入门-DTO数据传输层

在 Spring Boot 应用中&#xff0c;DTO&#xff08;Data Transfer Object&#xff0c;数据传输对象&#xff09; 是专门用于在不同层&#xff08;如 Controller 层、Service 层、外部系统&#xff09;之间传输数据的对象。它的核心目的是解耦数据模型和业务逻辑&#xff0c;避免…

安装docker,在docker上安装mysql,docker上安装nginx

目录 一.安装docker 1.1查看Linux版本的命令这里推荐两种&#xff1a; 1.2查看内核版本有三种方式&#xff1a; 2.安装 2.1 如果之前安装了docker&#xff0c;先删除旧版本的doker 2.2 安装需要的软件包&#xff0c;yum-util提供yum-config-manager功能&#xff0c;另外两…

Android killPackageProcessesLSP 源码分析

该方法用于终止指定包名/用户ID/应用ID下符合条件的应用进程&#xff0c;涉及多进程管理、资源冻结、进程清理及优先级更新等操作。核心流程分为进程筛选、资源冻结、进程终止与资源恢复三个阶段。 /*** 从已排序的进程列表中&#xff0c;提取从指定起始索引 startIdx 开始的连…

openAICEO山姆奥特曼未来预测雄文之三个观察

《三个观察》 山姆奥特曼 这篇文章主要讲的是关于AGI&#xff08;人工通用智能&#xff09;的未来发展及其对社会的影响&#xff0c;用大白话总结如下&#xff1a; 核心观点&#xff1a; AGI是什么&#xff1f; AGI是一种能像人类一样解决各种复杂问题的智能系统&#xff0c;比…

部署yolo到k230教程

训练&#xff1a;K230 借助 AICube部署AI 视觉模型 YOLO等教程_嘉楠 ai cube多标签分类-CSDN博客K230模型训练ai cube报错生成部署文件异常_aicube部署模型显示生成部署文件异常-CSDN博客 部署&#xff1a; # 导入必要的库和模块 import os import ujson # 超快的JS…

Flask 应用封装成 Docker 服务的完整技术指南

一、实现原理 容器化核心逻辑 Docker 通过将应用代码、运行环境和依赖项打包成镜像&#xff0c;实现环境一致性。Flask 应用容器化需包含&#xff1a; Python 基础运行环境项目代码及依赖库&#xff08;requirements.txt&#xff09;WSGI服务器&#xff08;如 Gunicorn&#xf…