红黑树(Red Black Tree,RBTree)
一、为什么引入红黑树?
平衡二叉树(AVL):插入/删除很容易破坏“平衡”特性,需要频繁调整树的形态。如:插入操作导致不平衡,则需要先计算平衡因子,找到最小不平衡子树(时间开销大),再进行LL/RR/LR/RL调整。
红黑树(RBT):插入/删除很多时候不会破坏“红黑”特性,无需频繁调整树的形态。即便需要调整,一般都可以在常数级时间内完成。
平衡二叉树:适用于以查为主、很少插入/删除的场景。
红黑树:适用于频繁插入、删除的场景,实用性更强。
二、红黑树的定义
一棵红黑树是满足如下红黑性质的二叉排序树:
1.每个结点或是红色,或是黑色。
2.根结点是黑色。
3.叶结点(虚构的外部结点、NULL结点)都是黑色的。
4.不存在两个相邻的红结点(即红结点的父结点和孩子结点均是黑色的)。
5.对每个结点,从该结点到任意一个叶结点的简单路径上,所含黑结点的数量相同。
总结:左根右,根爷黑,不红红,黑路同。
三、红黑树的推论
1.从根到叶结点的最长路径不大于最短路径的2倍。
2.有n个内部结点的红黑树的高度h<=2log2^(n+1)。
四、红黑树的查找
与BST、AVL相同,从根出发,左小右大,若查找到一个空叶结点,则查找失败。
五、红黑树的插入
·先查找,确定插入位置(原理同二叉排序树),插入新结点。
.新结点是根一一染为黑色
.新结点非根一一染为红色
·若插入新结点后依然满足红黑树定义,则插入结束。
·若插入新结点后不满足红黑树定义,需要调整(看新结点叔叔的“脸色”),使其重新满足红黑树定义。
·黑叔:旋转+染色
·LL型:右单旋,父换爷+染色
·RR型:左单旋,父换爷+染色
·LR型:左、右双旋,儿换爷+染色
·RL型:右、左双旋,儿换爷+染色
.红叔:染色+变新
·叔父爷染色,爷变为新结点。
六、红黑树的删除
在红黑树中删除结点的处理方式和“二叉排序树的删除”一样。
删除结点后,可能破坏“红黑树特性”,此时需要调整结点颜色、位置,使其再次满
足“红黑树特性”。
七、关于红黑树的操作大家可以自己去在线演示网站试试:
英文版:Red/Black Tree Visualization https://www.cs.usfca.edu/~galles/visualization/RedBlack.html
英文版网站还有各种数据结构的在线演示:
Data Structure Visualization https://www.cs.usfca.edu/~galles/visualization/Algorithms.html