红黑树(一)旋转

红黑树简介及左旋、右旋、变色 红黑树简介及红黑树的左旋、右旋、变色 阅读详情

红黑树属于平衡二叉树,所以很多操作根二叉树是一样的。学习红黑树,首先要把二叉树理解,并能用代码实现。

  我主要讲述我是怎么写一棵红黑树的,并不做过细的解释。我们主要学习旋转,插入,删除。其他操作根二叉树是一样的。

  旋转跟插入操作,我是跟STL源码剖析学的,书上讲的很清楚,一个上午就可以理解+实现,然后下午学习删除操作,呵呵。。。删除操作书中没有介绍,我是对照算法导论里的伪代码跟在网上找的代码学的。不过有的博客里的源码有错误,建议大家先把他的代码粘下来,然后多运行两便,确定没问题后再跟他的代码学习。

  接下来讲旋转操作,旋转操作就是变换元素位置,已达到平衡的目的。

左旋操作,这个并不难,基本理解过程就可以写出代码,要注意的是,如果1是根节点,转转之后把7设成根节点。


复制代码
//左旋
//1.将x的右孩子设为y的左孩子(如果y存在左孩子,将左孩子的父亲设为x)
//2.将y的父亲设为x的父亲,将x的父亲的孩子设为y(根据x的情况,考虑左右孩子,是否是根节点)
//3.将x的父亲设为y,将y的左孩子设为x
static void left_rotate(Node * x, Tree * tree)
{
    Node * y;//y是x的右孩子

    y = x->right;
    x->right = y->left;
    if ( y->left != nil )
        y->left->parent = x;
    y->parent = x->parent;
    if ( tree->root != x )
    {
        if ( x == x->parent->left )
            x->parent->left = y;
        else
            x->parent->right = y;
    }
    else
        tree->root = y;
    y->left = x;
    x->parent = y;
}
复制代码

大家可以根据自己的理解,实现代码。注意,左旋,旋转点一定要有左孩子。

右旋跟左旋操作一样,将left与right对换。这里不做介绍。

还有一种操作叫双旋,是通过左旋跟右旋来完成的。这里简单介绍一下。

第一步,以5为旋转点,左旋。

第二步,以10为旋转点,右旋。


HashMap底层实现原理:红黑树左旋右旋 HashMap中的红黑树左旋、右旋: 一、什么是左旋、右旋: 红黑树的性质: 每个节点要么是黑色,要么是红色 根节点是黑色 每个叶子节点(NIL)是黑色 每个红色结点的两个子结点一定都是黑色 任意一结点到每个叶子结点的路径都包含数量相同的黑结点 每当对红黑树结点进行增删改的时候可能会破坏红黑树的性质,因此我们需要维持这5条性质。有三种方式:变色、左旋、右旋.变色简单,本文会根据HashMap的源码分析左旋和右旋 1)左旋 以结点p作为支点进行左旋,其左子结点不变,右子结点变为p的右子节点的左子结点,且p的 阅读详情

相关推荐

树 —— 红黑树

源代码地址:https://github.com/Zheng-Wenkai/DataStructure.git 一,红黑树的介绍 1. 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。 2. 在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为O(logn)。

starter_____的博客 2388

红黑树详解,对插入旋转独到理解

R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。 将一个节点插入到红黑树中,需要执行哪些步骤呢?首先,将红黑树当作一颗二叉查找树,将节点插入;然后,将节点着色为红色;最后,通过旋转和重新着色等方法来修正该树,使之重新成为一颗红黑树。详细描述如下: 第一步: 将红黑树当作一颗二叉查找树,将节点插入。 红黑树本身就是一颗二叉查找树,将节点插入后,该树仍然是一颗二叉...

Allence的博客 2751

理解“红黑树”

(本文主要参考与网络上一些文章加上自己的理解,代码来自JULY http://blog.youkuaiyun.com/v_JULY_v/article/details/6169600 ) 在真正理解红黑树之前,我觉得它是一座难以翻越的大山;当我有点理解了它,如释重负。 看红黑树之前,我看了AVL树,觉得还是比较好理解,对于红黑树,我曾经有一些疑问: 1.为什么要用红黑来标记? 2.红黑结点如何做到

Lemon 923

玩转红黑树:算法背后的平衡与旋转技巧

本文深入探讨了红黑树(Red-Black Tree)的原理与实现。红黑树是一种自平衡的二叉查找树,保证了查找、插入和删除操作的时间复杂度为O(logn)。文中详细介绍了红黑树的基本规则,如节点颜色、树的平衡性要求及插入时的修复操作。同时,结合代码示例,讲解了红黑树的插入过程、旋转操作以及如何修复可能违反树规则的情况。通过对红黑树的存储结构、查找操作和平衡性检查的分析,帮助读者深入理解这一数据结构的高效性与应用场景。

酷酷的崽的博客 2160

affymatrix探针转换 | GPL5175探针对应的基因转换

一般情况下,有一些比较成熟的对应平台的注释数据集的R包。但是这个注释平台,我在Bioconductor上找了一圈都没有找到。只能通过最原始也最可靠的方法,从GEO数据集上去下载这部分的注释文件。以下展示全过程。 我要检查的数据平台是:GPL5157。 数据集的注释集链接为:https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GPL5175 这个注释数据集比较难弄的地方在于,它的基因集注释的不太好。没有比较直接的可供提取的genesample的信息;在ge.

weixin_40640700的博客 7124

Win10环境下VS2019离线部署OnnxRuntime的完整指南

本文提供了在Windows 10系统下,为Visual Studio 2019进行OnnxRuntime离线部署的完整教程。针对网络受限环境,详细讲解了如何获取正确的离线安装包、配置本地NuGet源,并逐步指导项目配置与测试,确保AI模型在C++环境中顺利运行。

weixin_29205061的博客 400

【C++】 ——红黑树的旋转(详细图解+附C++代码)

红黑树1、红黑树的概念2、红黑树的性质3、红黑树的插入(1)情况一:叔叔不存在(1)情况二:叔叔存在且为黑4、红黑树的代码实现 1、红黑树的概念 红黑树是一棵二叉搜索树 所有的左孩子都小于根结点,右孩子都大于根结点 红黑树是一棵基本平衡的树(左右高度差不超过1) 红黑树最大深度小于等于最小深度的二倍 2、红黑树的性质 性质: (1)每个节点是红色或者黑色 (2)根结点是黑色 (3)所有叶节点是...

Vicky_Cr的博客 1163

(Touch™)搭建 Windows 开发环境

> OpenHaptics 开发包参考文档。

置心一处,便无事不办 1500

红黑树系列一:旋转

红黑树系列一:旋转 红黑树一棵在每个结点上增加了一个存储位来表示结点颜色(红色RED或黑色BLACK)的二叉搜索树。 二叉搜索树简单的说就是:对树中任何结点x,其左子树中的关键字最大不超过x.key,即对左子树中任一结点y,有y.key;其右子树中的关键字最小不低于x.key,即对右子树中任一结点y,有y.key>x.key。 红黑树中每个结点包含5个属性:col

sophiaFXR的博客 3821

金融数据自动化:从同花顺API到Excel的智能转换之旅

本文详细介绍了如何利用同花顺API实现金融数据自动化处理,并将其智能转换为Excel格式的全流程。通过Python编程和Excel高级技巧,读者可以掌握从数据获取、清洗到输出的完整解决方案,大幅提升金融数据分析的效率和准确性。文章特别强调了同花顺API的使用技巧和Excel自动化输出的最佳实践。

sql99的博客 461

工业预测模型避坑指南:PHM2012轴承数据实战中,LSTM、CNN、Transformer到底怎么选?

本文深入探讨了工业预测模型在PHM2012轴承数据下的选型策略,对比了LSTM、CNN和Transformer等主流模型在轴承寿命预测任务中的表现。通过真实实验数据,提供了可复现的选型决策框架,帮助工程师根据数据规模、硬件条件和精度要求选择最佳模型。文章还揭示了工程落地中的隐藏陷阱,如数据不均衡和工况迁移挑战,并提出了解决方案。

weixin_33694172的博客 493

红黑树 02 添加元素(一)保持根节点为黑色 & 左旋转

保持根节点为黑色 红黑树的性质之一就是:根节点为黑色; 添加元素后,可能导致红黑树根节点的变动,因此要维护根节点为黑色的属性; // 向红黑树中添加新的元素(key, value) public void add(K key, V value){ root = add(root, key, value); root.color = BLACK; // 最终根节点为黑色节点 }...

乌鲁木齐001号程序员 259

R语言实战:5分钟搞定GEO单细胞数据(scRNA-seq)下载与整理(附完整代码)

本文详细介绍了如何使用R语言快速下载和整理GEO单细胞数据(scRNA-seq),提供完整的自动化处理代码。从环境准备、数据获取到文件整理和质量检查,涵盖10X Genomics标准格式及非标准数据的处理技巧,帮助生物信息学研究者高效完成数据预处理工作。

weixin_29054399的博客 601

数据结构:红黑树的旋转原理和模拟实现

红黑树的旋转原理和模拟实现 我们了解到AVL树虽然效率很高,但是它是通过多次的旋转才到达一个绝对的平衡,旋转的消耗其实也很大。因此开始引入近似平衡的一棵树----红黑树(RBTree)。红黑树每一个节点不是红色的就是黑色的,它保证了最长路径不超过最短路径的二倍。 其实一般来说使用红黑树会比AVL树更多,因为虽然AVL树是更加平衡的,但是它的平衡是通过更多次的旋转得到的,旋转的时候消耗还是很大的。而...

ETalien_的博客 1121

学习STM32的CAN总线通信

在配置时,确保您启用了CAN总线功能。CAN节点是CAN总线上的一个设备,每个节点都有唯一的标识符。在CAN总线中,有两种类型的节点:CAN控制器和CAN外设。步骤2:配置CAN总线 在STM32CubeMX中,选择CAN总线模块并进行必要的配置。在CAN总线中,有两个重要的概念:CAN节点和CAN帧。步骤5:测试CAN总线通信 在成功编译和烧录代码后,您可以使用串口调试助手或其他CAN总线工具来测试CAN总线通信。步骤3:编写CAN总线通信代码 在项目的主代码文件中,我们将编写CAN总线通信的示例代码。

2401_85258012的博客 496

QT-Creator安装教程(windows)

本文介绍了Qt的下载安装步骤:1)通过镜像源下载安装包;2)运行exe文件时使用命令行参数指定镜像地址;3)在安装过程中选择路径和自定义安装组件,包含QT5和QT6版本的详细安装说明;4)安装后可继续添加扩展包或卸载组件。重点提示了QT6必须勾选的关键组件,并提供了组件管理的操作方法。

qq_53545309的博客 3105

红黑树

红黑树 一、红黑树的概念: 红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现[关联数组。 二、红黑树的特点: 节点是红色或者黑色 根节点是黑色 每个叶子的节点都是黑色的空节点(NULL) 每个红色节点的两个子节点都是黑色的。 从任意节点到其每个叶子的所有路径都包含相同的黑色节点。 三、二叉查找树(BST)特...

开心就好 6153

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

android搜索文字变色_红黑树的变色与旋转

红黑树的变色与旋转一向比较绕,这篇文章假定你有相当的基础,不会介绍二叉树以及节点为之间的关系,也不会说二叉搜索树左右子节点大小关系,以及它退化到链表的情况,更不会解释红黑树的优点,我会通过十分形像的符号变化来理清旋转的过程。我们先回顾一下概念,红黑树之所以叫红黑树,是因为它有这些约束:节点要么是红色要么是黑色根节点必须是黑色叶子节点挂两个空节点(逻辑上)是黑色每个红色节点有两个黑色子节点,推导出一...

weixin_33213367的博客 96

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ConcurrentHashMap 红黑树转换分析

ConcurrentHashMap 红黑树转换分析 先看红黑树的基本概念:红黑树是一课特殊的平衡二叉树,主要用它存储有序的数据,提供高效的数据检索,时间复杂度为O(lgn)。红黑树每个节点都有一个标识位表示颜色,红色或黑色,具备五种特性: 每个节点非红即黑 根节点为黑色 每个叶子节点为黑色。叶子节点为NIL节点,即空节点 如果一个节点为红色,那么它的子节点一定是黑色 从一个节点到该节点的子孙节点...

木村的博客 3234

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

数据结构(六)——红黑树及模拟实现

在前面的文章我们介绍了AVL这一棵完全二叉搜索树,我们分析后发现AVL树查找的时间复杂度是O(logN),说明这是一个很优秀的数据结构,但是在底层实现我们发现,AVL树为了维持它的性质,是需要进行频繁的旋转的,这样会造成不必要的消耗,那么有没有一种数据结构既可保证它的时间复杂度为O(logN),又能避免频繁的旋转呢?这就是我们今天要介绍的红黑树,学习了红黑树之后我们将用红黑树作为底层,去封装实现一个模拟的map和set,下面让我们一起来学习吧。

f040731_007的博客 1276

为什么红黑树查询快_目前最详细的红黑树原理分析(大量图片+过程推导!!!)...

一.为什么要有红黑树这种数据结构?我们知道ALV树是一种严格按照定义来实现的平衡二叉查找树,所以它查找的效率非常稳定,为O(log n),由于其严格按照左右子树高度差不大于1的规则,插入和删除操作中需要大量且复杂的操作来保持ALV树的平衡(左旋和右旋),因此ALV树适用于大量查询,少量插入和删除的场景中那么假设现在假设有这样一种场景:大量查询,大量插入和删除,现在使用ALV树就不太合适了,因为AL...

weixin_39971172的博客 1452

红黑树中nil结点_漫画:什么是红黑树?

前言017年,小灰曾经发布过一篇关于红黑树的漫画,当时由于时间仓促,部分知识点一带而过,并没有讲解得很细致全面。最近,小灰把这个知识点重新做了总结,分成上下两篇,希望大家把红黑树这个重要的数据结构彻底吃透。 ————— 第二天 —————————————————二叉查找树(BST)具备什么特性呢?1.左子树上所有结点的值均小于或等于它的根结点的值。2.右子树上所有结点的值均大于或等于它的根结点的值...

weixin_39962341的博客 390

一文带你入门红黑树,从树到红黑树的进化

一文带你入门红黑树,从树到红黑树的进化 ​ 树是数据结构里十分基础又十分重要的结构,它的应用很广泛。同时它也是数据结构和算法中重要的部分。算法经常会考察二叉树的一些操作,在面试中平衡二叉搜索树、红黑树(RB-Tree)也是考核的重点,这类题大多考察我们对树这类数据结构的掌握程度。本文从树的导览出发,从 树到二叉树、平衡二叉搜索树一直到AVL树,AVL树的插入、AVL树的旋转、最后再到红黑树、红黑树的插入、旋转与变色,带你逐步掌握红黑树的这种数据结构。 1.1树的导览 1.2 二叉搜索树(binary s

Quan的博客 243

红黑树效率为甚恶魔是log_一文带你彻底读懂红黑树(附详细图解)

红黑树简介红黑树是一种自平衡的二叉查找树,是一种高效的查找树。它是由 Rudolf Bayer 于1972年发明,在当时被称为对称二叉 B 树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的红黑树。红黑树具有良好的效率,它可在 O(logN) 时间内完成查找、增加、删除等操作。因此,红黑树在业...

weixin_42300144的博客 542
上一篇: 大数据5V特点 --- 5Vs of Big Data
下一篇: 红黑树(二)插入
! 不再维护
博客等级 码龄11年 63粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值