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 ...
随机推荐
- webpack配置命令
从2015年开始,webpack就是当前最火的构建工具.跟着时代向前走.准没错.我们要追随大神的脚步.走在前端技术栈的前列.大神等等我. 由于webpack是基于nodejs环境下的.所以先安装nod ...
- Java Web之会话管理二:Session
一.Session 在web开发中,服务器可以为每个yoghurt浏览器创建一个会话对象(Session)对象.注意:一个浏览器独占一个Session对象.因此,在需要保存用户数据时,服务器程序可以把 ...
- Dom 概览
前言 我们已经接触并使用了很多api去操作html文档,例如:appendChild,getElementById, 等等.但是,每当我在浏览器输入document,window 按下回车,会发现还有 ...
- 利用Object.prototype.toString方法,实现比typeof更准确的type校验
Object.prototype.toString方法返回对象的类型字符串,因此可以用来判断一个值的类型. 调用方法: Object.prototype.toString.call(value) 不同 ...
- MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box)
本节继续讲解常用控件--按钮控件的使用. 按钮控件简介 按钮控件包括命令按钮(Button).单选按钮(Radio Button)和复选框(Check Box)等.命令按钮就是我们前面多次提到的侠义的 ...
- shell获得python的print的值
#!/usr/bin/env python print('aaa') #!/bin/bash var=`python testpython.py` (注意这个引号,是反引号,Tab上面的那个...) ...
- OpenCV 计算区域的内部参数
对于一个区域,怎么进一步针对区域内部特征进行处理呢 ? 首先,我们要提取出来内部的某些特征才能说话,下面提取一些简单的特征,话不多说见代码: 1.平均数及方差参数: Mat tempMean, tem ...
- 在myeclipse2014使用git上传github
简介 首先在myeclipse中安装github客户端插件,这里就不说了,跟安装svn客户端插件一样的步骤 1.选中要push到github的工程右键team->share project-&g ...
- java.lang.Comparable<T> 接口
package java.lang; import java.util.*; public interface Comparable<T> { public int compareTo(T ...
- x-csrf-token