算法导论学习笔记——第13章 红黑树
2015-05-27 18:26
337 查看
红黑树
红黑树是一种二叉查找树,但在每个结点上增加一个存储位存储结点的颜色,可以是red或black。通过对任意一条从根到叶的路径上结点颜色的限制,红黑树确保没有任何一条路径比其他路径长出两倍,因而是接近平衡的。
每个结点包含5个域,color,key,left,right,p
满足以下红黑性质:
1、每个结点是红色或黑色
2、根结点是黑色
3、每个叶结点(nil)是黑色
4、如果一个结点是红色,那么它的两个子结点都是黑色
5、对每个结点,从该结点到它每个子孙结点的路径上,黑结点数目相同
左旋转
插入
删除
红黑树是一种二叉查找树,但在每个结点上增加一个存储位存储结点的颜色,可以是red或black。通过对任意一条从根到叶的路径上结点颜色的限制,红黑树确保没有任何一条路径比其他路径长出两倍,因而是接近平衡的。
每个结点包含5个域,color,key,left,right,p
满足以下红黑性质:
1、每个结点是红色或黑色
2、根结点是黑色
3、每个叶结点(nil)是黑色
4、如果一个结点是红色,那么它的两个子结点都是黑色
5、对每个结点,从该结点到它每个子孙结点的路径上,黑结点数目相同
左旋转
LEFT-ROTATE(T,x) y←right[x] right[x]←left[y] p[left[y]]←x p[y]←p[x] if p[x]==nil[T] then root[T]←y else if x=left[p[x]] then left[p[x]]←y else right[p[x]]←y left[y]←x p[x]←y
插入
RB-INSERT(T,z) y←nil[T] x←root[T] while x!=nil[T] do y←x if key[z]<key[x] then x←left[x] else x←right[x] p[z]←y if y=nil[T] then root[T]←z else if key[z]<key[y] then left[y]←z else right[y]←z left[z]←nil[T] right[z]←nil[T] color[z]←RED RB-INSERT-FIXUP(T,z) //保持红黑性质 RB-INSERT-FIXUP(T,z) while color[p[x]]=RED do if p[z]=left[p[p[z]]] then y←right[p[p[z]]] if color[y]=RED then color[p[z]]←BLACK color[y]←BLACK color[p[p[z]]]←RED z←p[p[z]] else if z=right[p[x]] then z←p[x] LEFT-ROTATE(T,z) color[p[z]]←BLACK color[p[p[z]]]←RED RIGHT-ROTATE(T,p[p[z]]) else ( same as then clause with "right" and "left" exchanged ) color[root[T]]←BLACK
删除
RB-DELETE(T,z) if left[z]=nil[T] or right[z]=nil[T] then y←z else y←TREE-SUCCESSOR(z) if left[y]!=nil[T] then x←left[y] else x←right[y] p[x]←p[y] if p[y]=nil[T] then root[T]←x else if y=left[p[y]] then left[p[y]]←x else right[p[y]]←x if y!=z then key[x]←key[y] copy y's satellite data into z if color[y]=BLACK then RB-DELETE-FIXUP(T,x) return y //保持红黑性质 RB-DELETE-FIXUP(T,x) while x!=root[T] and color[x]=BLACK do if x=left[p[x]] then ω←right[p[x]] if color[ω]=RED then color[ω]=BLACK color[p[x]]←RED LEFT-ROTATE(T,p[x]) ω←right[p[x]] if color[left[ω]]=BLACK and color[right[ω]]=BLACK then color[ω]←RED x←p[x] else if color[right[ω]]=BLACK then color[left[ω]]←BLACK color[ω]←RED RIGHT-ROTATE(T,ω) ω←right[p[x]] color[ω]←color[p[x]] color[p[x]]←BLACK color[right[ω]]←BLACK LEFT-ROTATE(T,p[x]) x←root[T] else ( same as then clause with "right" and "left" exchanged ) color[x]←BLACK
相关文章推荐
- 【算法导论】学习笔记——第13章 红黑树
- 算法导论学习笔记-第十三章-红黑树
- 算法导论学习笔记(三)红黑树
- 算法导论 学习笔记 第九章 中值和顺序统计
- 算法导论学习笔记-1-基础排序算法
- 基础知识 第一部分 算法导论 学习笔记
- 算法导论 学习笔记 第五章 概率分析和随机化算法
- 算法导论学习笔记(16)——图的基本算法
- 算法导论--第六章学习笔记
- 算法导论学习笔记-第五章-概率分析和随机算法
- 算法导论学习笔记——基数排序
- 麻省理工算法导论学习笔记(5)----线性时间排序
- 算法导论学习笔记-找数组中第二小的数
- 算法导论学习笔记——第8章 线性时间排序
- 算法导论学习笔记-第十八章-B树
- 【算法导论-学习笔记】以线性时间增长的排序——计数排序
- 算法导论学习笔记之摊还分析
- 【算法导论学习-26】 二叉树专题4:红黑树、AVL树、B-Tree
- 【算法导论】学习笔记——第10章 基本数据结构