红黑树学习

2023-11-05

红黑树的是一种特殊的二叉搜索树,有如下性质:

    性质1. 节点是红色或黑色。

性质2. 根是黑色。

性质3 每个叶节点是黑色的。

性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

   性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

 

 

红黑树和AVL树的区别

在于它使用颜色来标识结点的高度,它所追求的是局部平衡而不是AVL树中的非常严格的平衡。之前我们在讲解AVL树时,已经领教过AVL树的复杂,但AVL树的复杂比起红黑树来说简直是小巫见大巫。红黑树是真正的变态级数据结构。自从红黑树出来后,AVL树就被放到了博物馆里,据说是红黑树有更好的效率,更高的统计性能。

关于红黑树是不是AVL的一种,我认为不是。如图构造一颗红黑树,但其显然不是平衡树,按《算法导论》的原话,它是接近平衡的。

红黑树的应用:

红黑树优异的性能在各个地方均可以大显身手。

STL标准模板库的set和map容器,底层均采用红黑树的机制来实现

Linux内核中内存的管理有两种方式,一个是链表,另外一种方式就是红黑树;具体来说,可以通过内存描述符中的mmap和mm_rb来访问内存区域。

红黑树插入的时候调整四种情况

http://www.ibm.com/developerworks/cn/java/j-lo-tree/index.html?ca=drs-#author

一共分为四种情况:

(1)       新节点是红黑树的根节点;

在这种情形下,直接将它设置为黑色以满足性质 2

(2)       新节点的父节点是黑色的;

在这种情况下,新插入的节点是红色的,因此依然满足性质 4。而且因为新节点 N 有两个黑色叶子节点;但是由于新节点 N是红色,通过它的每个子节点的路径依然保持相同的黑色节点数,因此依然满足性质5

(3)       父节点P和父节点的兄弟节点U都是红色

在这种情况下,程序应该将 P 节点、U 节点都设置为黑色,并将 P 节点的父节点设为红色(用来保持性质 5)。现在新节点 N 有了一个黑色的父节点 P。由于从 P 节点、U 节点到根节点的任何路径都必须通过 G 节点,在这些路径上的黑节点数目没有改变(原来有叶子和 G 节点两个黑色节点,现在有叶子和 P 两个黑色节点)。经过上面处理后,红色的 G 节点的父节点也有可能是红色的,这就违反了性质 4,因此还需要对 G 节点递归地进行整个过程(把 G 当成是新插入的节点进行处理即可)。

                                叔节点为RED

(4)       父节点 P 是红色、而其兄弟节点 U 是黑色或缺少;且新节点 N 是父节点 P 的右子节点,而父节点 P 又是其父节点 G 的左子节点。

在这种情形下,我们进行一次左旋转对新节点和其父节点进行,接着按情形 5 处理以前的父节点 P(也就是把 P 当成新插入的节点即可)。这导致某些路径通过它们以前不通过的新节点 N 或父节点 P 的其中之一,但是这两个节点都是红色的,因此不会影响性质 5

                             叔节点为黑色或不存在,新加入节点为父亲的右孩子

(5)       父节点 P 是红色、而其兄弟节点 U 是黑色或缺少;且新节点 N 是其父节点的左子节点,而父节点 P 又是其父节点 G 的左子节点。

                                 叔节点为黑色或者不存在,新加入的节点为父亲左孩子

这种情形下,需要对节点 G 的一次右旋转,在旋转产生的树中,以前的父节点 P 现在是新节点 N 和节点 G 的父节点。由于以前的节点 G 是黑色,否则父节点 P 就不可能是红色,我们切换以前的父节点 P 和节点 G 的颜色,使之满足性质 4,性质 5 也仍然保持满足,因为通过这三个节点中任何一个的所有路径以前都通过节点 G,现在它们都通过以前的父节点 P。在各自的情形下,这都是三个节点中唯一的黑色节点。

 

实际上,记住(3)和(5)就可以了。遇到(4)转换成(5)的情况即可。

由此观之,要理解红黑树,必须理解旋转的概念。

1.左旋

 

理解如下(看了1个小时,以前一直没有看懂,还是画图好些):

1.rb_node_t* right = node ->right;

新建一个right指针来取得node->right的操作权;

如图所示:

 

 

 

 

 

 

2.node->right = right->left

如图所示

 

node->right = right->left

3.right->left->parent = node;

 

bparent指针指向了node。为了图片的简洁,我省略了画出parent指针

4.right->left = node;

  node节点成为了right节点的左孩子,如图所示:

 right->left = node

5.node->parent->right = right or node->parent->left = right

处理node的父亲节点的指针,node父亲节点的孩子现在变成了right

右旋的情况于此相类似,

如此,就基本实现了红黑树的插入操作。

红黑树的删除操作还没有看

 

左旋node节点如下:

|  node             right

|  /  /       ==>   /  /

|  a  right        node y

|     /              / /

|             b       y                               a      b

 

代码描述如下(摘自http://blog.csdn.net/v_JULY_v/archive/2011/01/03/6114226.aspx

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

红黑树学习 的相关文章

随机推荐

  • GET请求传参对象的list

    之前试过get请求传参是数组 但是试的都是基本类型 现在需求要是自定义的对象 怕写的不对 就提前自测了一下 调用方代码 Resource private TestClient testClient Test public void apiT
  • B站教学资源爬虫

    B站教学资源爬虫 最近遇到了点麻烦事 各种学习网站的不维护或者转移路线 于是将目标站点定位到了b站的学习资源 所用语言和相关模块 python3 6 requests PIL 目前网站特点分析 b站是一个具有大量资源数据的网站 但是如何将目
  • 14、OSPF学习心得2

    1 OSPF的报文 1 Hell报文 作用 1 建立和发现邻居 2 维护OSPF的邻居关系 2 DBD报文 用于描述LSDB的摘要信息 3 LSR报文 用于向对方请求所需的具体的LSA信息 4 LSUpdate 用于向对方发送具体的LSA
  • 在Linux上搭建JAVAEE的开发环境

    1 安装JDK 1 下载安装包 jdk 8u121 linux x64 tar gz 2 把JDK安装包上传到Linux系统中的 opt 目录下 通过xftp软件连接上Linux 然后双击要上传的安装包即可上传 3 解压JDK安装包 命令
  • 逻辑漏洞归纳总结

    Web安全渗透方向 三大核心 输入输出 登录体系 权限认证 典型的web漏洞 注入 跨站 上传 代码执行等属于输入输出这个层级 这也是OWASP早期比较侧重的 近年来 像越权漏洞 逻辑绕过 接口安全等逐渐增多 这些属于登录体系和权限认证这个
  • LaWGPT基于中文法律知识的大语言模型_初步安装

    准备代码 创建环境 下载代码 git clone git github com pengxiao song LaWGPT git cd LaWGPT 创建环境 conda create n lawgpt python 3 10 y cond
  • 【高效办公】程序员专用云笔记推荐

    一 参考资料 推荐几款好用的云笔记软件 云 社区 腾讯云 Markdown基本语法 简书 Markdown菜鸟教程
  • webpack-serve 的使用

    webpack serve 官方已经不维护了 还请继续食用webpack dev server 基本情况 仓库地址 配合webpack4食用最佳 在webpack3及以前的版本会有帮助信息提示 因为热加载使用的是WebSockets 所以在
  • 基于Arduino的循迹小车搭建

    材料准备 我做的是双层的循迹小车 这个网上有套件可以直接购买 到了之后组装是比较简单的 如果有不会组装的去bilbil上找一下教程也是很方便的 https www bilibili com video BV1Pe4y197DN spm id
  • 工作流Activiti7整合SpringBoot使用

    前言 一个软件系统中具有工作流的功能 我们把它称为工作流系统 一个系统中工作流的功能是什么 就是对系统的业务流程进行自动化管理 所以工作流是建立在业务流程的基础上 所以一个软件的系统核心根本上还是系统的业务流程 工作流只是协助进行业务流程管
  • 8086的写总线周期

    http www2 zzu edu cn qwfw wjylcai list asp id 127 写总线周期用来完成对存储器或I O端口的一次写操作 1 T1状态 总线周期的第一个时钟周期主要用于输出存储器地址或I O地址 如果M IO
  • android 右边充满 左边自适应,RelativeLayout中的格局,自适应宽度布局

    RelativeLayout中的布局 自适应宽度布局 该图片中为android布局 总布局为 RelativeLayout AtLeft 为居左 android layout height wrap content android layo
  • mf253s移动版变全网通_中国电信发布5G全网通终端需求白皮书v2.0

    2019 11 07 10 56 2019年10月31日 中国5G正式商用 标志着5G发展已进入快车道 整个社会各行各业对5G热情高涨 业界纷纷增加5G投入 5G终端的发展进程必将加快 市场空间巨大 潜力无限 为更好地引导产业链 推动5G加
  • nuxt.js服务端渲染使用flexible.js和postcss-px2rem实现移动端自适应—淘宝弹性布局方案(750px设计稿)

    在用vue做服务端渲染的时候需要对移动端做适配所以要用到postcss 2rem插件 第一步 首先下载flexible js 可加载阿里的cdn文件 http g tbcdn cn mtb lib flexible 0 3 4 flexib
  • Error: Package: mysql-community-server-5.6.41-2.el7.x86_64 (mysql56-community) Requires:

    http www cnblogs com xiaoluo501395377 archive 2013 04 07 3003278 html MySQL登陆失败 ERROR 2002 HY000 Can t connect to local
  • JDK与Tomcat的安装及配置教程

    code ran 超级详细的JDK与Tomcat的安装及配置教程 1 JDK的安装与环境配置 首先我们需要去官网上下载JDK对应的版本 以我现在要下载的1 8为例 1 官网 JDK官网地址 具体操作如下 然后下载之后去下载路径下去安装即可
  • k8s v1.2 web界面——kubernetes-dashboard详解

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 Kube dashboard介绍 dashboard功能 Kube dashboard是kube 1 2版本中新增的 具备与kubelet commandline类似的
  • LeetCode——049

    49 Group Anagrams My Submissions QuestionEditorial Solution Total Accepted 73397 Total Submissions 267525 Difficulty Med
  • 一些VR延迟优化方法

    VR中的 延迟 特指 Motion To Photon Latency 指的是从用户运动开始到相应画面显示到屏幕上所花的时间 这中间经过了大概这么几个步骤 传感器采集运动输入数据 采集到的数据进行过滤并通过线缆传输到主机 游戏引擎根据获取的
  • 红黑树学习

    红黑树的是一种特殊的二叉搜索树 有如下性质 性质1 节点是红色或黑色 性质2 根是黑色 性质3 每个叶节点是黑色的 性质4 每个红色节点的两个子节点都是黑色 从每个叶子到根的所有路径上不能有两个连续的红色节点 性质5 从任一节点到其每个叶子