DataStructure——红黑树学习笔记
1.前言
- 本文伪码和解释参考:
http://blog.csdn.net/v_JULY_v/article/details/6105630
- C实现的源码本文未贴出,请见:
http://blog.csdn.net/v_july_v/article/details/6114226
- July的博客对红黑树的分析很精彩,请见:
http://blog.csdn.net/v_JULY_v/article/category/774945
本文对参考资料有所修订和补完(侵删)。
2.正文
伪码中使用的符号:
N:node,当前节点
S:sibling,当前节点的兄弟节点
P:praent,当前节点的父节点
U:uncle,当前节点的叔节点,即父节点的兄弟节点
G:graparent,当前节点的祖辈节点,即父节点的父节点
←:赋值
==或=:是否相等
≠:不等
x.p:x的父节点
N:L或N:R:节点N是父节点的左孩子(大写L,Left),或,节点N是父节点的右孩子(大写R,Right)
N:r或N:b:节点N是红色的(小写r,red),或,节点N是黑色的(小写b,black)
<N:r>:条件判断,判断N:r是否成立
#n:相当于#Case n,即情况n(n=,,.....)
L_rt(N)或R_rt(N):以节点N为轴心,进行左旋转操作(L_rt),或,右旋操作(R_rt)
伪码:
//-------------RBTree:Insesrt-----------//
RB-INSERT(T, z)
y ← nil
x ← T.root
while x ≠ nil
do y ← x
if z.key < x.key
then x ← x.left
else x ← x.right
z.p ← y
if y == nil
then T.root ← z
else if z.key < y.key
then y.left ← z
else y.right ← z
z.left ← nil
z.right ← nil
z.color ← RED
RB-INSERT-FIXUP(T, z) //-------------RBTree:Insert-FIXUP-----------//
RB-INSERT-FIXUP(T, z)
while z.p.color == RED //fixup only in case P:r
do if z.p == z.p.p.left //P:L
then y ← z.p.p.right
if y.color == RED //U:r , # Case
then z.p.color ← BLACK //P ← b,U ← b,G ← r #
y.color ← BLACK
z.p.p.color ← RED
z ← z.p.p //N ← G
else //U:b , # Case -> # Case
if z == z.p.right //N:R ,
then z ← z.p // N ← P,L_rt(T,N)
LEFT-ROTATE(T, z)
z.p.color ← BLACK //<U:b> , P ← b,G ← r,R_rt(T,G) # Case
z.p.p.color ← RED
RIGHT-ROTATE(T, z.p.p)
else if z.p == z.p.p.right //<P:R>
y ← z.p.p.left
if y.color == RED //<U:r> , # Case
then z.p.color ← BLACK //P ← b,U ← b,G ← r #
y.color ← BLACK
z.p.p.color ← RED
z ← z.p.p //N ← G
else //<U:b> , # Case -> # Case
if z == z.p.left //<U:b,N:L> , N ← P,R_rt(T,N)
then z ← z.p
RIGHT-ROTATE(T, z)
z.p.color ← BLACK //<U:b> , P ← b,G ← r,L_rt(T,G) # Case
z.p.p.color ← RED
LEFT-ROTATE(T, z.p.p)
T.root.color ← BLACK //-------------RBTree:Delete-----------//
RB-DELETE(T, z) //y was deleted , x
if z.left = NIL or z.right = NIL //N doesnot have child node
then y ← z
else y ← TREE-SUCCESSOR(z) //TREE-SUCCESSOR(z):find the Lmax in subtree:z
if y.left ≠ NIL
then x ← y.left
else x ← y.right
if x ≠ NIL
x.p ← y.p
if y.p = NIL //in case N is root
then T.root ← x
else if y = y.p.left //in case single child
then y.p.left ← x
else y.p.rght ← x
if y ≠ z //in case double child
then z.key ← y.key //cover but not remove
copy y's satellite data into z
if y.color = BLACK //fixup only when <N:b>=true
then RB-DELETE-FIXUP(T, x)
return y //-------------RBTree:Delete-Fixup-----------//
RB-DELETE-FIXUP(T, x)
while x ≠ T.root and x.color = BLACK
do
if x = x.p.left //<N:L>
then w ← x.p.right //w ← S:R
if w.color = RED //<w:r> #1
then w.color ← BLACK //S:b , P:r , L_rt(P) ,w ← S:R
x.p.color ← RED
LEFT-ROTATE(T, x.p)
w ← x.p.right
if w.left.color = BLACK and w.right.color = BLACK //<S.left:b & S.right:b> #2
then w.color ← RED //S:r , N ← P
x ← x.p
else if w.right.color = BLACK //<S.right:b> #3
then w.left.color ← BLACK //S.left:b , S:r , R_rt(S) ,
w.color ← RED
RIGHT-ROTATE(T, w)
w ← x.p.right //new N's S cos of the R_rt()
w.color ← x.p.color //S.color ← P.color,P:b,S.right:b,L_rt(P), #4
x.p.color ← BLACK
w.right.color ← BLACK
LEFT-ROTATE(T, x.p)
x ← T.root //break,exit while{}
else
w ← x.p.left
if w.color = RED
then w.color ← BLACK
x.p.color ← RED
RIGHT-ROTATE(T, x.p)
w ← x.p.left
if w.left.color = BLACK and w.right.color = BLACK
then w.color ← RED
x ← x.p
else if w.left.color = BLACK
then w.right.color ← BLACK
w.color ← RED
LEFT-ROTATE(T, w)
w ← x.p.left
w.color ← x.p.color
x.p.color ← BLACK
w.left.color ← BLACK
RIGHT-ROTATE(T, x.p)
x ← T.root
x.color ← BLACK
DataStructure——红黑树学习笔记的更多相关文章
- JDK源码学习笔记——TreeMap及红黑树
找了几个分析比较到位的,不再重复写了…… Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例 [Java集合源码剖析]TreeMap源码剖析 java源码分析之TreeMap基础篇 ...
- 【stl学习笔记】红黑树
转自维基百科 红黑树是一种平衡二叉搜索树,它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目. 性质: 红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色.在二叉查找 ...
- 算法设计和数据结构学习_5(BST&AVL&红黑树简单介绍)
前言: 节主要是给出BST,AVL和红黑树的C++代码,方便自己以后的查阅,其代码依旧是data structures and algorithm analysis in c++ (second ed ...
- 算法导论学习---红黑树具体解释之插入(C语言实现)
前面我们学习二叉搜索树的时候发如今一些情况下其高度不是非常均匀,甚至有时候会退化成一条长链,所以我们引用一些"平衡"的二叉搜索树.红黑树就是一种"平衡"的二叉搜 ...
- [Data Structure] 红黑树( Red-Black Tree ) - 笔记
1. 红黑树属性:根到叶子的路径中,最长路径不大于最短路径的两倍. 2. 红黑树是一个二叉搜索树,并且有 a. 每个节点除了有左.右.父节点的属性外,还有颜色属性,红色或者黑色. b. ( 根属性 ...
- 红黑树( Red-Black Tree ) - 笔记
1. 红黑树属性:根到叶子的路径中,最长路径不大于最短路径的两倍. 2. 红黑树是一个二叉搜索树,并且有 a. 每个节点除了有左.右.父节点的属性外,还有颜色属性,红色或者黑色. b. ( 根属性 ...
- 大数据学习--day17(Map--HashMap--TreeMap、红黑树)
Map--HashMap--TreeMap--红黑树 Map:三种遍历方式 HashMap:拉链法.用哈希函数计算出int值. 用桶的思想去存储元素.桶里的元素用链表串起来,之后长了的话转红黑树. T ...
- Java容器汇总【红黑树需要再次学习】
1,概述 2,Collection 2.1,Set[接触比较少] 2.1.1 TreeSet 底层由TreeMap实现 基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作.但是查找效率不如 ...
- BST&AVL&红黑树简单介绍
(BST&AVL&红黑树简单介绍) 前言: 节主要是给出BST,AVL和红黑树的C++代码,方便自己以后的查阅,其代码依旧是data structures and algorithm ...
随机推荐
- 关于引用JS和CSS刷新浏览器缓存问题
有时候我们会碰到上线的新版本都要刷新一次缓存的问题.那是因为改了JS的内容,但是JSP引用的地方后面的字符串未发生改变导致浏览器读取浏览器缓存而不会重新加载新的JS内容,以下提供两种解决方式: 1.每 ...
- 浅谈html5及其新特性
什么是 HTML5? HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML 的上一个版本诞生于 1999 年.自从那以后,Web 世界已经经历了巨变. HTML5 仍 ...
- Hibernate学习笔记(二)
2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...
- cocos2dx解决苹果正版ipv6的问题
苹果官方出了新的规定,要求新上架的app都必须单独支持ipv6-only的网络. 具体的要求链接:https://developer.apple.com/library/mac/documentati ...
- 流媒体测试笔记记录之————阿里云监控、OBS、FFmpeg拉流和推流变化比较记录
OBS设置视频(512kbps)和音频(128kbps)比特率 阿里云监控结果: 使用FFmpeg拉流到Nginx 服务器测试比特率 第二次测试,修改视频和音频比特率 OBS设置 阿里云监控 Ngin ...
- servlet学习笔记_4
一.response.1.response.characterEncoding和response.setContentType("text/html;charset=UTF-8") ...
- java ZipOutputStream压缩文件,ZipInputStream解压缩
java中实现zip的压缩与解压缩.java自带的 能实现的功能比较有限. 本程序功能:实现简单的压缩和解压缩,压缩文件夹下的所有文件(文件过滤的话需要对File进一步细节处理). 对中文的支持需要使 ...
- SAP 采购订单收货时报错:对于采购订单xxxx无收货可能
因为这个问题查了挺长时间,所以写在博客里记录下. 报错详细: 每个公司的配置不同,我公司遇到的这个问题原因是这里的确认控制是从信息记录带过来的,问题解决方法是,修改下确认控制的选项: 修改确认控制的后 ...
- 搭建nginx+tomcat+Java的负载均衡环境
转载 未测 供参考 另外这篇文章也不错.http://blog.csdn.net/wang379275614/article/details/47778201 一.简介: Tomcat在高并发环境下 ...
- message from server: "Host 'XXX' is not allowed to connect to this MySQL server
Access denied for user 'root'@'XXXXX' (using password: YES) mysql命令不正确造成: grant all privileges on *. ...