完整简单的红黑树算法
最近组内定个规矩,每周分享一个算法,上周是第一周,分享的是红黑树,下面是自己学习总结的,感觉网上的都不是特别清楚,要么是写的特别复杂,没有一点条理。
一、红黑树性质
1.每个结点要么是红的要么是黑的
2.根结点是黑的
3.每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的
4.如果一个结点是红的,那么它的两个儿子都是黑的
5.对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点
总结:平衡状态下红黑树要么单支黑-红,要么有两个子节点
二、复杂度
O(lgn)
三、结点插入
将一个节点插入到红黑树中,需要执行哪些步骤呢?首先,将红黑树当作一颗二叉查找树,将节点插入;然后,将节点着色为红色;最后,通过旋转和重新着色等方法来修正该树,使之重新成为一颗红黑树。
1.将插入的节点着色为红色,不会违背"特性(5)"!少违背一条特性,就意味着我们需要处理的情况越少。接下来,就要努力的让这棵树满足其它性质即可;满足了的话,它就又是一颗红黑树了
2.对于"特性4",是有可能违背的!
总之:新插入的结点是红色!
3.插入的5种情况:
(1)如果插入的是根结点,由于原树是空树,此情况只会违反性质2,因此直接把此结点涂为黑色;
(2) 如果插入的结点的父结点是黑色,由于此不会违反性质2和性质4,红黑树没有被破坏,所以此时什么也不做。
(3) 如果当前结点的父结点是红色且祖父结点的另一个子结点(叔叔结点)是红色;
解决: 将当前节点的父节点和叔叔节点涂黑,祖父结点涂红,把当前结点指向祖父节点,从新的当前节点重新开始算法。
以下(4)(5)都以左孩子为例,右孩子进行对称操作即可
(4)当前节点的父节点是红色,叔叔节点是黑色,当前节点是其父节点的左孩子;
解决: 父节点变为黑色,祖父节点变为红色,在祖父节点为支点右旋。
(5)当前节点的父节点是红色,叔叔节点是黑色,当前节点是其父节点的右子;
解决:当前节点的父节点做为新的当前节点,以新当前节点为支点左旋。问题转为(4)
总结:整个过程就是解决以上几个问题,关键是整个过程要更新当前节点是哪个结点
四、结点删除
需要执行的操作依次是:首先,将红黑树当作一颗二叉查找树,将该节点从二叉查找树中删除;然后,通过"旋转和重新着色"等一系列来修正该树,使之重新成为一棵红黑树。
待删除的节点按照儿子的个数可以分为三种:
1.删除叶结点(没有子结点)
(1)如果叶结点为红色,直接删除
(2)如果叶结点为黑色,兄弟结点没有子结点
解决: 兄弟节点B绘为红色,父节点P绘为黑色。
注意:之后操作的结点全为左孩子,右孩子进行对称操作即可
(3)叶结点为黑色,兄弟结点有一个孩子不为NIL。若这个孩子为右孩子。
解决:将B的这个右孩子绘为黑色,B绘为其父节点P原来的颜色,P绘为黑色,然后对P进行一次左旋转。
(4)叶结点为黑色,兄弟结点有一个孩子不为NIL,若这个孩子为左孩子。
解决:将B的这个左孩子绘为黑色,B绘为红色,然后对B进行一次右旋转,问题转化为右孩子的情况。
(5)叶结点为黑色,兄弟结点有两个孩子。 若兄弟结点(B)为红色,则B的两个孩子一定为黑色。
解决:将B绘为黑色,B的左孩子绘为红色,然后对P(父结点)进行一次左旋转。
(6)叶结点为黑色,兄弟结点(B)有两个孩子。 若B为黑色,则B的两个孩子一定为红色。
解决:将B的父节点P绘为黑色,B的右孩子绘为黑色,B绘为其父节点P原来的颜色,然后对P进行一次左旋转。
2.删除结点有一个外部结点(有一个子结点, 这个结点C一定是红色节点,否则从D到各个NIL节点的路径上的黑色节点数目就会不同)
解决:交换D(删除结点)和C(子结点)的内容(颜色保持不变),被删除节点变为C,问题转化为被删除节点的两个孩子都为NIL的情况。重新查看树是否满足红黑树。
3.删除结点有两个外部结点(有两个子结点)
解决:按照二叉查找树删除节点的方法找到D的后继节点S,交换D和S的内容(颜色保持不变),被删除节点变为S,如果S有不为NIL的节点,那么继续用S的后继节点替换S(此过程可能是一级一级找,也可能是直接找左子树的最大值,取决于本来要删除的结点和实际删除结点的值的大小,要删除的结点比实际删除的结点小,一级一级找,否则相反),直到被删除节点的两个孩子都为NIL,问题转化为被删除节点D的两个孩子都为NIL的情况。
其中的左旋右旋其实也很简单,有不清楚的大家上网查查,此处不再详细叙述了。
五、应用场景
1.著名的linux进程调度Completely Fair Scheduler,用红黑树管理进程控制块
2.epoll在内核中的实现,用红黑树管理事件块
3.nginx中,用红黑树管理timer等
4.Java的TreeMap实现
5.广泛用在C++的STL中。map和set都是用红黑树实现的。
六、其他
从头到尾的插入和删除操作案例插图:
http://blog.csdn.net/v_july_v/article/details/6284050
nginx 红黑树的实现(c实现)
http://blog.csdn.net/liuxuejiang158blog/article/details/21417145
c的红黑树实现
http://www.cnblogs.com/skywang12345/p/3624177.html#a3
php的红黑树实现
http://www.zhangley.com/article/php_rbtree/
转载于:https://www.cnblogs.com/zhb-php/p/5504481.html
完整简单的红黑树算法相关推荐
- python:实现红黑树算法(附完整源码)
python:实现红黑树算法 from __future__ import annotations from collections.abc import Iterator class RedBlac ...
- 通过分析 JDK 源代码研究 TreeMap 红黑树算法实现--转
TreeMap 和 TreeSet 是 Java Collection Framework 的两个重要成员,其中 TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口的常 ...
- 红黑树算法原理及实现
红黑树 一.简介 红黑树(Red Black Tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组. 红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入 ...
- C++ RBTree(红黑树) 算法(附完整源码)
C++ RBTree红黑树的算法 RBTree(红黑树) 的完整源码(定义,实现,main函数测试) RBTree(红黑树) 的完整源码(定义,实现,main函数测试) #include<ios ...
- javascript 红黑树算法与说明
红黑树的介绍 红黑树是一种平衡二叉树.这种树可以进行高效的中序遍历.通过对任何一条从根到叶子的简单路径上各个节点的颜色进行约束,确保没有一条路径会比其他路径长2倍,因而是近似平衡的.所以相对于严格要求 ...
- HashMap底层红黑树实现(自己实现一个简单的红黑树)
文章整理于小刘老师讲源码 视频学习链接:小刘老师讲解红黑树 JDK集合源码之HashMap解析(上) JDK集合源码之HashMap解析(下) 1.树结构入门 1.1 什么是树? 树(tree)是一种 ...
- 红黑树动画+红黑树算法详细介绍
说起红黑树,先给一个js的实现.可以动画看效果 https://www.cs.usfca.edu/~galles/visualization/RedBlack.html 然后算法问题,我再描述一遍也没 ...
- TreeMap 红黑树算法实现
TreeMap 的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点. TreeSet 和 TreeMap 的关系 为了让大家了解 TreeMap 和 Tre ...
- 漫画:5 分钟学会红黑树算法!
作者 | 阿广 责编 | 伍杏玲 下面为标准的二叉排序树: 初始状态: 其实想要搜索值为226的节点很简单,搜索动画过程如下: 这样不行! 这是个病! 得治! 红黑树就是一种平衡的二叉查找树,说他平衡 ...
最新文章
- 机器学习(MACHINE LEARNING)主成分分析(PCA降维)
- mysql 查询多边形_mysql中判断一个点是否在多边形中
- Matplotlib画图常用方法总结(全)
- SAP UI5 System Test 的工具之一:uiveri5
- PMP 第七章 项目成本管理
- android slidingdrawer 方向,如何使Android SlidingDrawer从左侧滑出?
- (转)微信公众平台关于fakeid和openid的解析
- 计算机一级第103套题,全国计算机等级考试一级试题
- java stream, LIST ,ArrayList常用操作
- mysql gitd 数据结构同步失败_MySQL案例-GTID同步失败:master has purged binary logs
- 用计算机写高中数学程序框图,画“程序框图”,高中数学最实用基本技能之一...
- html+css发光字体
- 解决错误Establishing SSL connection without server‘s identity verification is not recommended.
- 2563: 阿狸和桃子的游戏
- 用mysql查询所以同学学号_mysql数据库练习查询41题答案
- Vue+SpringBoot图书管理系统前后端分离(教你一步一步搭建)
- 软件测试真的干到35岁就干不动了吗?
- 个人HTML、CSS综合
- 证书不被信任解决方法
- Matlab转Python问题之二维数组单索引寻值
热门文章
- 从XKCD网站下载自动所有漫画图片---python实现
- 百万年薪挖了个P7程序员,难道是“水货”?
- 计算机科学与技术毕业生简历,计算机科学与技术专业应届毕业生简历范文
- hibernate mysql语句_打印hibernate的SQL语句的几种办法
- python 不显示图片 直接保存图片 matplotlib 后端执行指令
- mqtt实例 php_php搭建MQtt协议服务
- navicat mysql 还原_navicat如何给mysql还原数据库
- python execute异步执行_封装了一个对mysql进行异步IO的小工具
- mysql 分区表 限制_Mysql分区表使用的一些限制和需要注意的地方-阿里云开发者社区...
- fatal: git-write-tree: error building trees