红黑树是许多“平衡的”查找树中的一种,它能保证在最坏的情况下,基本的动态集合操作(插入和删除)的时间为O(lgh)。我们先简单叙述二叉查找树的性质。

1.1 二叉查找树

二叉查找树性质:设x为二叉树中的任一结点,那么对于x左子树中的任一结点y都有key[y]≤key[x],x右子树中的任一结点y都有key[x]≤key[y]。

设二叉树高度为h,下面是各个操作的算法时间复杂度:

静态操作:查找结点、找前驱、后继等时间为O(h)

动态操作:插入和删除结点等时间为O(h)

对于插入操作,新结点总是插入在某个叶结点位置;对于删除操作需依被删结点z的情况而定:

①z无左右孩子

②z只有一个孩子

③z的左右孩子均存在

1.2 红黑树

1.2.1红黑树的特性

红黑树首先是一棵二叉查找树,所以二叉查找树的所有性质红黑树都具有,此外还有自身五个性质:

①每个结点要么是黑色要么是红色

②树根结点的颜色为黑色

③叶结点(nil)为黑色

④如果某个结点为红色,则它的左、右孩子结点均为黑色

⑤对树中任一结点,所有从该结点出发到其叶结点的路径中均包含相同数目的黑色结点

外部结点(external node,叶节点):不包含实际关键字

内部结点(internal node):包含实际关键字

分别代表:双亲,保存的值,左孩子,右孩子,颜色。

黑高度(Black height):黑高度bh(x)表示从x结点出发(不包含x结点)到其叶结点路径上的黑色结点个数。

Thearem1:具有n个内部结点的红黑树高度最多为2lg(n+1)。

proof:设红黑树的高度为h,即要证明h≤2lg(n+1)。

一个简单的数学归纳法,直接把老师的屁屁踢图片放上了。

由该定理大致猜到,动态集合操作的插入和删除都可以在O(lgn)时间内完成。

1.2.2 红黑树的调整操作

旋转(rotate)分为两种:左旋和右旋操作。

左旋的伪码。

一个实际操作:

1.2.3 红黑树的插入操作

插入一个新结点分为二步完成:

1. 按照二叉查找树的方式插入新结点z

2. 恢复红黑树的特性

首先检查红黑树5个特性可能遭受破坏的情况,然后针对遭受破坏的特性制定具体恢复的策略。(这里是将插入点置为红色会产生下列情况,若置插入点为黑色,则性质⑤容易被破坏,所以我们置插入点为红色,这样就避免破坏性质⑤)

①每个结点要么是黑色要么是红色(未被破坏)

②树根结点的颜色为黑色(有可能被破坏,但修复很简单)

③叶结点(nil)为黑色(未被破坏)

④如果某个结点为红色,则它的左、右孩子结点均为黑色(有可能被破坏)

⑤对树中任一结点,所有从该结点出发到其叶结点的路径中均包含相同数目的黑色结点(未被破坏)

因此我们需要修复的只可能是第②和④条性质。伪码如下。

else same as那里是指镜像的情况,所有的left和right都镜像变成right和left。

该算法在每次迭代的开头保持下列三个部分的不变式:

①节点z是红色的

②如果z.p是根节点,则z.p是黑节点

③若有任何红黑树的性质被破坏,则至多只有一条性质被破坏,或者是性质2,或者是性质4。(事实上,性质2被破坏,是由于z是根节点且是红节点。如果性质4被破坏,其原因是z和z.p都是红节点。)

下面用一个例子实际操作一下这段代码,简单顺一下这个过程。

以一个实际例子来说明如何从头开始生成一棵红黑树。首先是一份小总结。

1.2.4 红黑树的删除

这东西是真的繁琐,不写了,有需要再看。还有红黑树的应用什么的,假期再补上吧。

下面是一篇写的很好的文章。

程序员吴师兄:我画了 20 张图,给女朋友讲清楚红黑树​zhuanlan.zhihu.com

忘掉了,还有个需要注意的地方,写在最后。

这个图b)里注意看根节点,它有一个父节点,是个空的黑节点。

——————————————————————————————————————

下午写流,然后晚做周一要讲的数据挖掘竞赛的PPT。期末复习真的好烦啊,没时间做自己想学的东西。

红黑树的删除_红黑树相关推荐

  1. 红黑树+java+删除_红黑树深入剖析及Java实现

    红黑树是平衡二叉查找树的一种.为了深入理解红黑树,我们需要从二叉查找树开始讲起. BST 二叉查找树(Binary Search Tree,简称BST)是一棵二叉树,它的左子节点的值比父节点的值要小, ...

  2. 红黑树的删除_红黑树揭秘

    红黑树可能是一般数据结构书中代码逻辑最复杂的结构.多数材料都只是讲构建红黑树的步骤,并没有探究红黑树背后的思想.本文通过对红黑树背后逻辑的梳理,提供给大家一种理解红黑树的方法.首先我们先给出红黑树的定 ...

  3. 红黑树的删除_深入理解红黑树

    前言 前面的文章已经介绍过二叉搜索树,AVL树,以及2-3Tree,今天我们再来学习一下二叉搜索树里面的大佬,它就是红黑树.红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计算 ...

  4. 红黑树的删除_从红黑树的本质出发,彻底理解红黑树!

    前言 早上好,我是彤哥. 上一节,我们一起从二叉树.二叉查找树.平衡树.AVL树.2-3树.2-3-4树.B树,一路讲到红黑树,最后得出红黑树的本质:红黑树就是2-3-4树,请看下图: 我们知道2-3 ...

  5. 红黑树的原理_红黑树插入算法实现原理分析

    ­ 引言 红黑树是在实际工程中被广泛应用的一种数据结构,比如Linux中的线程调度就是使用的红黑树来管理进程控制块,而Nginx中也是使用红黑树来管理的timer,Java中的TreeMap和Tree ...

  6. 红黑树模拟软件_红黑树

    红黑树 发布时间:2018-08-10 15:12, 浏览次数:415 一.在理解红黑树之前,先看一些二叉查找树 二叉查找树特性:左字数上所有的节点的值都小于或等于他的根节点上的值 右子树上所有节点的 ...

  7. 为什么红黑树查询快_红黑树为什么比二叉查找树更高效

    平衡二叉查找树 什么是平衡二叉查找树 二叉树中任意一个节点的左右子树的高度相差不能大于 1,这是一种较为严格的定义,但是实际工程中使用,不会要求这么严格,只要实际的高度不比 log2(n)大很多,能达 ...

  8. 红黑树的优势_红黑树在不同场景的应用及其优势

    红黑树(平衡的排序二叉树),满足以下性质: 1)每个结点要么是红的,要么是黑的. 2)根结点是黑的. 3)每个叶结点,即空结点(NIL)是黑的. 4)如果一个结点是红的,那么它的俩个儿子都是黑的. 5 ...

  9. 红黑树的删除_Python实现红黑树的删除操作

    上一篇文章使用Python实现了红黑树的插入操作.参考:Python实现红黑树的插入操作本篇文章使用Python实现红黑树的删除操作.先将红黑树的5条特性列出来:1. 节点是红色或黑色.2. 根节点是 ...

最新文章

  1. 大班运用计算机教学案例,幼儿园大班体验课程教学案例
  2. react中context到底是如何传递的-源码分析
  3. this的用法this.name=name 这个什么意思
  4. cocos2d里面如何实现MVC(一)
  5. 勤哲linux客户端,Excel在线编辑
  6. 【idea】IDEA中TODO以及FIXME等关键字不高亮显示修复
  7. DisSent: Learning Sentence Representations from Explicit Discourse Relations
  8. .net 编译、反编译、查壳、脱壳、反混淆工具
  9. 阿坝县人民医院管理系统软件硬件配置参数
  10. About Face 3:交互设计精髓pdf
  11. wwwscan网站目录文件批量扫描工具
  12. EXCEL表格-绝对引用符$详解
  13. 简易图片打像素标签工具
  14. 云脉高效数字化档案管理
  15. electron设置淘宝镜像
  16. 「Deep Learning」读书分享系列
  17. 2023年1月12日,openKylin 0.9.5正式发布!
  18. Ubuntu下的图像编辑软件
  19. SQL Server 发展简史
  20. A Deep Convolutional Neural Network for segmenting and classifying epithelial and stromal regions

热门文章

  1. 购买MP3必备资料 各大芯片方案齐齐数
  2. Python 基础,不看会后悔哦!
  3. 我到底该信谁?另外,我发现了抢火车票的秘密
  4. 为什么我不看好PWA
  5. android studio gradle home,Android Studio3.0 Gradle 4.1配置
  6. linux杀死进程删除文件,linux 常用到的命令 删除 移动 复制 查询端口 杀死进程 查询进程...
  7. 这个方法无需旋转就可使得横轴坐标不重叠!
  8. 如何将 Mac 恢复还原到以前的日期
  9. P5713 【深基3.例5】洛谷团队系统(python3实现)
  10. python协程asyncio 应用_Python-如何使用asyncio同时运行多个协程?