红黑树简单易懂讲解--附代码

系统磁盘从MBR格式转换成GPT格式来升级win11 之前的《》中说到,需要把磁盘格式转化为MBR格式才能执行下去。问题是,win10升级win11要求启动方式为UEFI的话,磁盘格式不能为MBR。其实不升级也不影响啥,但是就是想好看点。所以花了点时间折腾了一下。我这是双系统,所以直接去A系统修复B系统的磁盘格式和引导。 阅读详情

什么是红黑树以及由来

    这里先了解红黑树的由来,既然出现红黑树这种数据结构肯定是原本的数据结构不满足已知的问题所致。

二叉搜索树:

    起初最开始为二叉搜索树,这是最简单的树型结构。
    其定义:或者是一棵空树,或者是具有下列性质的二叉树:
    若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
    若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
    它的左、右子树也分别为二叉排序树。

但是其面临最基本的问题:
可以看到,在这种情况下,二叉搜索树退化成了链表!!!这时候查询、插入和删除一个元素的时候,时间复杂度变成了O(n),显然这是不能接受的。出现这种情况情况的原因是二叉搜索树没有自平衡的机制,所以就有了平衡二叉树的概念。在这里插入图片描述
平衡二叉树
定义:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。简而言之就是在二叉搜索树的基础上加上平衡机制来解决上面出现的问题。
推荐大家看看这个二叉树讲解,一篇文章解决!
在这里插入图片描述

但是,其仍然有很大的问题,最大的问题就是太麻烦,平衡二叉树的定义过于严格,导致每次插入或者删除一个元素之后,都要去维护二叉树整体的平衡,这样产生额外的代价又太大了。大家也不想再插入元素的时候等很长时间来处理吧,基于此我们慢慢提出来红黑树的原型-2-3树!
2-3树
大家看看下边推荐的文章,里边讲解基本原理,基本大家看懂了2-3树,红黑树也就懂了!
大家看看这个,简单易懂帮大家整理最好的!
红黑树
进入正题,红黑树性质如下:

      性质1:每个节点要么是黑色,要么是红色。
      性质2:根节点是黑色。
      性质3:每个叶子节点(NIL)是黑色。
      性质4:每个红色结点的两个子结点一定都是黑色。
      性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。

其中删除插入操作种类很多,推荐看这个简单入手
图解红黑树插入删除的各种情况

代码

红黑树节点定义:
其中key为节点中的值。

typedef int KEY_TYPE;

typedef struct _rbtree_node{
     unsigned char color;
     struct _rbtree_node *left;
     struct _rbtree_node *right;
     struct _rbtree_node *parent;

     KET_TYPE key;
     void *value;
 }rbtree_node;

定义红黑树:
root为指向这棵树的根节点;
nil为空节点,方便后续跟叶子节点作比较而来判断叶子节点使用;

typedef struct _rbtree{
    typedef struct *root;
    typedef struct *nil;
 };

左旋操作:
在这里插入图片描述

void _left_rotate(rbtree *T,rbtree *x){
    rbtree_node *y=x->right;
    x->right=y->right;
    if(y->right!=T->nil){//如果节点y的左子树存在再赋值
      y->right->parent=x;
     }
     y->parent=x->parent;
     if(x->parent==T->nil){
       T->root=y;
     }else if(x==x->parent->left){
       x->parent->left=y;
     }else{
       x->parent->right=y;
     }
     y->left=x;
     x->parent=y;
}

右旋操作

void _right_rotate(rbtree *T,rbtree *x){
    rbtree_node *x=y->left;
    y->left=x->left;
    if(x->right!=T->nil){//如果节点y的左子树存在再赋值
      x->right->parent=y;
     }
     x->parent=y->parent;
     if(y->parent==T->nil){
       T->root=x;
     }else if(y==y->parent->left){
       y->parent->left=x;
     }else{
       y->parent->right=x;
     }
     x->right=y;
     y->parent=x;
}

插入节点
寻找插入位置:

void rbtree_insert(rbtree *T,rbtree_node *z){
  rbtree_node *x=T->root;
  rbtree_node *y=T->nil;
  while(x!=T->nil){
    y=x;
    if(z->key<x->key){
      x=x->left;
    }else if(z->key>x->key){
       x=x->right;
    }else(
       return;
    }
  }
  z->parent-y;
   if(y==T->nil){
     T->root=z;
    }else if(z->key<y->key){
       y->left=z;
    }else(
       y->right=z;
    }
    z->left=T->nil;
    z->right=T->nil;
    z->color=RED;
    rbtree_insert_flxup(T,z);//调整函数
}

插入调整(左右旋转,变色处理):
这里边一共三种情况,如果不懂大家可以看看我推荐的文章。

void rbtree_insert_flxup(rbtree *T,rbtree_node *z){
  while(z->parent_>color==RED){
    if(z->parent==z->parent->parent->left){
      rbtree_node *y=z->parent->parent->right;
      if(y->color==RED){
        z->parent->color=BALACK;
        y->color=BALACK;
        z->parent->parent->color=REN;
        z=z->parent;
      }else{
        if(z==z->parent->right){
          z=z->parentp;
          _left_rotate(T,z);
        }
        z->parent->color=BALACK;
        z->parent->parent->color=RED;
        _right_rotate(T,z->parent->parent);
      }
    }
    else{
      rbtree_node *y=z->parent->parent->left;
      if(y->color==RED){
        z->parent->color=BALACK;
        y->color=BALACK;
        z->parent->parent->color=RED;
        z=z->parent;
      }else{
        if(z==z->parent->left){
          z=z->parentp;
          _right_rotate(T,z);
        }
        z->parent->color=BALACK;
        z->parent->parent->color=RED;
        _left_rotate(T,z->parent->parent);
    }  
  }
  T->root->color=BALACK;
}
          

删除节点
这个有点难

推荐大家看这个,讲的很清楚

总结

好了基本总结到这,我也是小白后续会陆续更新!

TCN(Temporal Convolutional Networks)时序卷积网络详解及代码 阅读详情

相关推荐

Sylvester结式法求解多项式方程

Sylvester结式法,结式,消元法,ctfshow 七夕杯 LUCK7,crypto,WriteUp

u010883831的博客 4475

红黑树(笔记)

map(这是一个红黑树的封装) nginx 定时器 进程调度的cfs(利用红黑树中序遍历是顺序,且查找速度快的特点,将调度的时间作为key值) 内存管理(调用malloc分配一块内存,表述一块内存的方式有两种:1. 开始位置+内存大小 2. 开始位置+结束位置。key:开始位置) 红黑树使用的地方: 1. key,value 注重查找的过程。 2. 利用红黑树的中序遍历是顺序的。 红黑树性质: 1. 每个节点是红色的或者黑色的 2. 根节点是黑色的 3. 每个叶子节点是黑色的 4.

EquinoxM的博客 2357

Android平台实现Airplay的方法及源代码

Airplay是由苹果公司推出的一项无线音视频传输技术,它允许用户将音频、视频和照片从iOS设备(如iPhone、iPad)或Mac电脑无线传输到支持Airplay的设备(如Apple TV、智能音箱等)。具体的解码和播放方式取决于你选择的库和技术。当Android设备启动AirplayService服务后,它将监听来自iOS设备的连接请求,并在建立连接后接收、解码和播放音视频数据。在AirplayService类的onStartCommand()方法中,我们需要处理Airplay的请求。

CyberLynxX的博客 1564

史上最详细的红黑树讲解(一篇文章教你手撕红黑树)

一篇讲解红黑树的文章,图文并茂,详细讲解

Lin5200000的博客 4277

红黑树(C语言实现)

红黑树c语言实现

qq_49723651的博客 6000

清楚易懂红黑树讲解

— 无论是节点值的替换,还是子树的整体替换,最终都要保证交换后树依然满足红黑树的约束条件,确保树的平衡和 O (log n) 的查询 / 插入 / 删除效率。它在二叉搜索树的基础上,在每个节点上增加了一个存储位来表示节点的颜色(红色或黑色)。通过对任何一条从根到叶子的路径上各个节点着色方式的限制,红黑树确保。从根节点到最远叶子节点的路径长度(主要取决于黑色节点数)不会超过到最近叶子节点路径长度的两倍,这就保证了平衡。红黑树通过上述规则和操作,在动态数据集中高效维持平衡,是工程中广泛使用的数据结构之一。

txj520lml的博客 846

【全网最易懂红黑树讲解】一眼看懂二叉树、平衡树、红黑树,一文打尽

什么是平衡树?平衡树,顾名思义,是一种内部结构平衡的树。它确保了树的高度保持在一个低水平,从而使得增加、删除、查找等操作都能在对数时间内完成。这种平衡通过确保树的每个节点的左右子树的高度差不超过特定的值来实现。平衡树的应用场景平衡树广泛应用于数据库索引、文件系统、网络路由等领域,几乎在任何需要快速数据检索的场合都能见到它的身影。红黑树是每个节点都带有颜色属性的二叉搜索树,颜色或为红色或为黑色。但它不仅仅是一个普通的二叉搜索树,它通过一系列的性质来维护树的平衡。

终于等到你啦~欢迎来到我的知识空间 这里是苏泽的成神之路 2466

C++ 红黑树 详细讲解

C++ 红黑树 详细讲解

foodsx的博客 1401

HashMap底层红黑树原理(超详细图解)+手写红黑树代码

在看完了小刘老师和黑马的源码视频之后,我整理了一篇HashMap的底层源码文章,学海无涯,这几天看了对红黑树讲解,故将其整理出来 HashMap底层源码解析上 HashMap底层源码解析下 视频链接 小刘老师讲源码 传智播客-黑马程序员 文章目录红黑树什么是树 红黑树 什么是树 树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合,它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合。把它叫做“树”是因为他看起来像一颗倒挂的树,也就是说它是根朝上,而叶向

wenwenaier的博客 2万+

手撕红黑树红黑树介绍 + 红黑树插入代码详细讲解

文章目录前引推荐数据结构可视化网址推荐讲解红黑树的博客与视频红黑树介绍1、接触红黑树的原因2、二叉搜索树的介绍1、二叉搜索树BST(不自平衡)2、AVL树(完美自平衡二叉搜索树)3、红黑树(综合性能强劲 不平凡的二叉弱平衡搜索树)3、红黑树的特性4、红黑树的属性介绍5、红黑树的插入代码解析1、没有根节点(直接插入)2、父节点黑色、叔节点任意(直接插入)3、父节点红、叔节点黑(LL、LR、RL、RR)1、LL旋转2、LR旋转3、RL旋转4、RR旋转4、父节点红、叔节点红(递归)红黑树代码实现(插入)1、验证数

Love 6's Private Blog 2663

红黑树的插入、及模拟实现红黑树代码 + 图解 + 注释)

红黑树

w903414的博客 2509

红黑树的优势_简单易懂带你了解红黑树

前言上一篇博客介绍了[二叉树].二叉搜索树在树是平衡的情况下搜索、插入和删除的效率都很好,但是如果二叉搜索树是不平衡的那么它的效率就不那么令人满意了,而红黑树解决了二叉搜索树的这个问题,可以始终保持树是平衡(大致平衡)的.阅读前须知:如果您对二叉树不太了解,请移步[二叉树]本文用到的评估红黑树效率的方法-- 大O表示法由于红黑树的实现代码过于晦涩难懂,所以本篇博客只会通过通俗易懂语言加上一目了然...

weixin_26516551的博客 701

红黑树简单介绍

根据上面的红黑树的性质和我们之前学习的AVL树的知识的铺垫,我们就可以很快的将红黑树的基本框架搭起来:与AVL树的平衡因子不同,红黑树除了节点外还要枚举节点的颜色我们将黑色和红色先进行枚举// 红黑树节点的定义{}// 节点的左孩子// 节点的右孩子// 节点的双亲(红黑树需要旋转,为了实现简单给出该字段)// 节点的值域// 节点的颜色大家可以看到我们在节点的颜色的初始化时的时候给了缺省参数是红色,这是为什么呢?大家可以想一想,

逃离枷锁,冲向天空! 1186

数据结构】如何创建一棵红黑树动图讲解

本篇文章围绕数据结构中的红黑树展开讲解,包含红黑树的性质、节点的定义、插入操作和验证红黑树等内容,内含自制动图方便理解

Eristic0618的博客 3075

数据结构红黑树讲解C++

数据结构红黑树讲解C++

2301_76269963的博客 2020

[C++][数据结构][红黑树]详细讲解

[C++][数据结构][红黑树]详细讲解

SnowK博客 4587

红黑树,超强动静图详解,简单易懂

写在前面红黑树,对很多童鞋来说,是既熟悉又陌生。学校中学过,只了解大概;工作中不怎么使用,但面试又是重点。每次需要查看红黑树内容时都很难以更生动形象的方式来理解其内容。没...

Java团长的博客 404

红黑树的插入(代码

红黑树的插入实现,代码

羊羊羊 1122

红黑树介绍

红黑树一、红黑树的概念红黑树的性质红黑树节点的定义红黑树结构二、使用步骤1.引入库2.读入数据总结 一、红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。 红黑树的性质 每个结点不是红色就是黑色 根节点是黑色的 如果一个节点是红色的,则它的两个孩子结点是黑色的 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数

mz474920631的博客 4万+

详细红黑树操作通俗易懂讲解(插入与删除+图片通俗讲解

详细通俗易懂红黑树操作讲解,快来看看吧

weixin_62513677的博客 1474

红黑树超详细视频,简单易懂

红黑树超详细视频,简单易懂,找了好久找到的,必须分享出来让大家知道 视频链接 视频链接

weixin_43085797的博客 911

红黑树详细讲解

红黑树是一种自平衡二叉搜索树,通过给每个节点增加 “颜色”(红色或黑色)属性,并对颜色施加约束,确保树的近似平衡 —— 任意一条从根到叶子的路径,长度不会超过其他路径的 2 倍,从而保证增删查改的时间复杂度为O(log N)。cur:新插入节点(红色);parent:cur 的父节点(红色,触发调整的原因);grandfather:parent 的父节点(黑色);uncle:parent 的兄弟节点(grandfather 的另一个子节点)。

2401_87727424的博客 972

SAE ARP4992B-中文 2019 加工溶液的定期检测.pdf

SAE ARP4992B_中文 2019 加工溶液的定期检测.pdf

12套Python计算机二级试题的资源文件.zip

12套Python计算机二级试题的资源文件.zip

上一篇: linux文件和目录管理
下一篇: 解读B树 附代码
asdefmdm
博客等级 码龄6年 2粉丝 · 5原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值