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. git本地提交到远程仓库命令

    创建好远程仓库,然后要从本地上传代码到远程仓库: 1.git init 初始化git本地仓库 2. git add 添加到暂存区 3. git commit -am "提交备注" ...

  2. Lambda表达式入门

    Lambda表达式是Java 8的重要更新,也是一个被广大开发者期待已久的新特性,Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接 ...

  3. RecyclerView 滑动检测 (上滑 up)(下滑 down)(顶部 top)(底部 bottom)

      RecyclerView 给我们的可以检测滑动事件的接口 只有 一个方法 recyclerview.setOnScrollListener()或者 recyclerview.addOnScroll ...

  4. Spring jar包详解

    Spring jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spri ...

  5. reactiveCocoa

    我的理解 1通过block把按钮的addtarget的监听,处理,两个步骤二合一了, 好处是若在本控制器内添加监听,更方便 在自定义类监听就不一定了,因为经常监听到了,不一定就是自己处理,一般另外通知 ...

  6. iOS开发 跳转系统设置

    NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; [[UIApplication sharedApplica ...

  7. SQL Server Reporting Service(SSRS) 第一篇 我的第一个SSRS例子

    很早就知道SQL SERVER自带的报表工具SSRS,但一直没有用过,最近终于需要在工作中一展身手了,于是我特地按照自己的理解做了以下总结: 1. 安装软件结构 SSRS全称SQL Server Re ...

  8. java获取年份的后两位

    public static String getDate(Date strDate) { String date = null; if (strDate!= null) { Calendar star ...

  9. 虚拟机EAL: Error reading from file descriptor

    这个是虚拟机安装固有的BUG,代码差异如下: diff --git a/lib/librte_eal/linuxapp/igb_uio/igb_uio.c b/lib/librte_eal/linux ...

  10. bind_module和DEFAULT_MODULE

    在入口文件中定义define('BIND_MODULE', 'Admin'); 默认就会去找Admin模块. 配置文件中的 'DEFAULT_MODULE' => 'Home', // 默认模块 ...