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——红黑树学习笔记的更多相关文章

  1. JDK源码学习笔记——TreeMap及红黑树

    找了几个分析比较到位的,不再重复写了…… Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例 [Java集合源码剖析]TreeMap源码剖析 java源码分析之TreeMap基础篇 ...

  2. 【stl学习笔记】红黑树

    转自维基百科 红黑树是一种平衡二叉搜索树,它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目. 性质: 红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色.在二叉查找 ...

  3. 算法设计和数据结构学习_5(BST&AVL&红黑树简单介绍)

    前言: 节主要是给出BST,AVL和红黑树的C++代码,方便自己以后的查阅,其代码依旧是data structures and algorithm analysis in c++ (second ed ...

  4. 算法导论学习---红黑树具体解释之插入(C语言实现)

    前面我们学习二叉搜索树的时候发如今一些情况下其高度不是非常均匀,甚至有时候会退化成一条长链,所以我们引用一些"平衡"的二叉搜索树.红黑树就是一种"平衡"的二叉搜 ...

  5. [Data Structure] 红黑树( Red-Black Tree ) - 笔记

    1.  红黑树属性:根到叶子的路径中,最长路径不大于最短路径的两倍. 2. 红黑树是一个二叉搜索树,并且有 a. 每个节点除了有左.右.父节点的属性外,还有颜色属性,红色或者黑色. b. ( 根属性 ...

  6. 红黑树( Red-Black Tree ) - 笔记

    1.  红黑树属性:根到叶子的路径中,最长路径不大于最短路径的两倍. 2. 红黑树是一个二叉搜索树,并且有 a. 每个节点除了有左.右.父节点的属性外,还有颜色属性,红色或者黑色. b. ( 根属性  ...

  7. 大数据学习--day17(Map--HashMap--TreeMap、红黑树)

    Map--HashMap--TreeMap--红黑树 Map:三种遍历方式 HashMap:拉链法.用哈希函数计算出int值. 用桶的思想去存储元素.桶里的元素用链表串起来,之后长了的话转红黑树. T ...

  8. Java容器汇总【红黑树需要再次学习】

    1,概述 2,Collection 2.1,Set[接触比较少] 2.1.1 TreeSet 底层由TreeMap实现 基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作.但是查找效率不如 ...

  9. BST&AVL&红黑树简单介绍

    (BST&AVL&红黑树简单介绍) 前言: 节主要是给出BST,AVL和红黑树的C++代码,方便自己以后的查阅,其代码依旧是data structures and algorithm ...

随机推荐

  1. final finally finalize

    final  //如果不是final 的话,我可以在checkInt方法内部把i的值改变(有意或无意的,       //虽然不会改变实际调用处的值),特别是无意的,可能会引用一些难以发现的BUG   ...

  2. select元素中设置padding效果

    更新2016-9-17:这个bug是在mac os上的发生,在window系统中不存在这个问题! 给select元素增加:padding-left:20px;但是未生效,如下图所示: 在select上 ...

  3. SpringMVC生成任意文件,访问链接即下载

    原理上讲就是返回的 ResponseEntity<byte[]> 形式的值就可以了 @RequestMapping("/api/watermark_download") ...

  4. bate阶段项目总结

    Beta里程碑总结 设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 要解决的问题是如何实现消息的发布与查看以及个人主页的实现:定义的基本清楚,团队 ...

  5. 《C++ Primer》学习笔记【第三部分 类设计者的工具】

    第13章 拷贝控制 使用default:=defult只能修饰默认构造函数或拷贝控制成员,显式地要去编译器生成合成的版本. 使用delete:=delete通知编译器不希望定义这些成员,禁止试图使用它 ...

  6. javascript中的事件冒泡、事件捕获和事件执行顺序

    谈起JavaScript的 事件,事件冒泡.事件捕获.阻止默认事件这三个话题,无论是面试还是在平时的工作中,都很难避免. DOM事件标准定义了两种事件流,这两种事件流有着显著的不同并且可能对你的应用有 ...

  7. OneProxy添加license

    proxy-license=XXXX-XXXX-XXXX-XXXX 放到proxy.conf中,然后重启proxy

  8. eclipse: The superclass "javax.servlet.http.HttpServlet" was not found 解决方案

    解决步骤: 1. 安装Tomcat8.5 Server 2. eclipse 新建Tomcat 8.5 Server 3. 配置build path 添加  Server Runtime 1.右键项目 ...

  9. 005_kafka_Java_API

    1.生产者Producer 1)添加依赖 <dependency> <groupId>org.apache.kafka</groupId> <artifact ...

  10. 从下往上看--新皮层资料的读后感 第四部分 来自神经元的设计-perceptron 感知机

    搬地方了,其他的部分看知乎:https://zhuanlan.zhihu.com/p/22114481 直到50年代,perceptron被Frank Rosenblatt搞了出来.perceptro ...