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. JavaScript继承

    最佳的继承范式 寄生组合继承 我们来看一下它的实现方式: function Object(o){ var TempObject = function(){}; TempObject.prototype ...

  2. HANA SQLScript

    数据类型 日期时间类型 DATE(日期) DATE 数据类型由年.月.日信息组成,表示一个日期值. DATA 类型的默认格式为‘YYYY-MM-DD’. YYYY 表示年, MM 表示月而 DD 表示 ...

  3. Generate Time Data(普通日期主数据)

    Note: While using this option you need to replicate the standard table into SAP HANA that is T005T, ...

  4. ORA-28001: the password has expired (DBD ERROR: OCISessionBegin) EM无法登录

    先发句牢骚,明明刚才写完了,发布的时候却说没登陆,一下子全没了. 今天打开EM发现提示 ORA-28001: the password has expired (DBD ERROR: OCISessi ...

  5. eclipse maven web环境搭建

    选择创建new project 勾选跳过创建类型选择(让eclipse创建标准maven项目) 填写组织ID,唯一ID,注意:如果选择打包类型为war包时,会生成web类型的maven工程 修改JRE ...

  6. 《C++ Primer》学习笔记【第一部分 C++基础】

    第2章  整型的赋值:当我们试着把一个超出其范围的值赋给一个指定类型的对象时,结果如何?答案取决于类型是signed还是unsigned的.对于unsigned,编译器会将该值对unsigned类型的 ...

  7. PBOC金融IC卡,卡片与终端交互的13个步骤,简介-第二组(转)

    四:脱机数据认证-可选终端进行脱机数据认证来,认证卡片.记住:对于某个事情,终端与卡片谁单独也说了不算,要二者都能干才能干. 终端依据卡片(AIP)和终端(终端性能)的支持情况,决定是否使用及使用哪种 ...

  8. sublime 3 安装go环境

    安装go环境是在go已经安装的情况下, 1 首先安装 Package Control ctrl + · 打开sublime 命令行模式 复制粘贴以下代码 import urllib.request,o ...

  9. TAP/TUN(二)

    tap.c代码      #include<assert.h> #include<fcntl.h> #include<stdio.h> #include<st ...

  10. android Glide图片加载框架的初探

    一.Glide图片加载框架的简介 谷歌2014年开发者论坛会上介绍的图片加载框架,它让我们在处理不管是网路下载的图片还是本地的图片,减轻了很多工作量, 二.开发步骤: 1.添加链接库 compile ...