数据结构之红黑树

红黑树

红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色.
红黑树是一种特定类型的二叉树,它是在计算机科学中用来组织数据比如数字的块的一种结构。若一棵二叉查找树是红黑树,则它的任一子树必为红黑树.红黑树是一种平衡二叉查找树的变体,它的左右子树高差有可能大于 1,所以红黑树不是严格意义上的平衡二叉树(AVL),但 对之进行平衡的代价较低, 其平均统计性能要强于 AVL 。由于每一颗红黑树都是一颗二叉排序树,因此,在对红黑树进行查找时,可以采用运用于普通二叉排序树上的查找算法,在查找过程中不需要颜色信息

红黑树的特点

性质1. 节点是红色或黑色。
性质2. 根节点是黑色。
性质3.所有叶子都是黑色。(叶子是NUIL节点)
性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5… 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
由于以上的性质,所以在红黑树中,最长路径不会超过最短路径的两倍
因为红黑树是一种特化的二叉查找树,所以红黑树上的只读操行与普通二叉查找树相同。

在红黑树进行插入的时候,插入节点(cur)的颜色一定是红色的

下面介绍插入时几种修复情况:
1.当Uncle节点为红色时
在这里插入图片描述
2.存在uncle节点为黑色或者不存在uncle节点
(1):cur为parent的左孩子,parent又为grandpa的左孩子

在这里插入图片描述
(2).cur为parent的右孩子,parent又为grandpa的右孩子
修复方式与2.(1)相反:parent进行左旋,parent变黑,grandpa变红

(3).cur为parent的右孩子,parent为grandpa的左孩子

在这里插入图片描述
(4).cur为parent的左孩子,parent为grandpa的右孩子
修复方式与2.(3)方向相反,对parent先进行右旋,原来的cur作为parent,原来的parent作为cur,然后parent左旋,颜色变成黑色,grandpa变红

最后最后记住完成每完成上面的操作,要将根节点的颜色变为黑色

红黑树的性能

红黑的性能与AVL相似,另外他们的适用范围是相同的.

1.红黑树不追求"完全平衡",即不像AVL那样要求节点的 |balFact| <= 1,它只要求部分达到平衡,但是提出了为节点增加颜色,红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,而AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多。

2.就插入节点导致树失衡的情况,AVL和红黑树都是最多两次树旋转来实现复衡rebalance,旋转的量级是O(1)

3.删除节点导致失衡,AVL需要维护从被删除节点到根节点root这条路径上所有节点的平衡,旋转的量级为O(logN),而红黑树最多只需要旋转3次实现复衡,只需O(1),所以说红黑树删除节点的rebalance的效率更高,开销更小!
AVL的结构相较于红黑树更为平衡,插入和删除引起失衡,如2所述,红黑树复衡效率更高;当然,由于AVL高度平衡,因此AVL的Search效率更高啦。

4.针对插入和删除节点导致失衡后的rebalance操作,红黑树能够提供一个比较"便宜"的解决方案,降低开销,是对search,insert ,以及delete效率的折衷,总体来说,RB-Tree的统计性能高于AVL.
5故引入红黑树是功能、性能、空间开销的折中结果。AVL更平衡,结构上更加直观,时间效能针对读取而言更高;维护稍慢,空间开销较大。红黑树,读取略逊于AVL,维护强于AVL,空间开销与AVL类似,内容极多时略优于AVL,维护优于AVL。基本上主要的几种平衡树看来,红黑树有着良好的稳定性和完整的功能,性能表现也很不错,综合实力强.

总结:实际应用中,若搜索的次数远远大于插入和删除,那么选择AVL,如果搜索,插入删除次数几乎差不多,应该选择红黑树. jdk/c++/Linux偏向使用红黑树,windows偏向使用AVL树.TreeSet和TreeMap就使用了红黑树,另外HashMap如果冲突过高,可使用红黑树代替链表.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值