红黑树(RB-Tree)

1、定义

  红黑树是一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是red或black。红黑树满足以下五个性质:

1. 每个结点或是红色或是黑色;

2. 根结点是黑色;

3. 每个叶结点是黑的;

4. 如果一个结点是红的,则它的两个儿子均是黑色;

5. 每个结点到其子孙结点的所有路径上包含相同数目的黑色结点。

这里写图片描述

  当对红黑树进行插入和删除操作时,可能会破坏红黑树的五个性质。为了保证红黑树的性质,需要进行变色和旋转

2、插入和删除

(1)插入
情况1:插入结点z的父结点为红色,而z的叔叔结点y是红色:变色即可。

扫描二维码关注公众号,回复: 1753569 查看本文章

这里写图片描述

情况2:z的父结点为红色,而z的叔叔结点y是黑色,而且z是右孩子:此时将当前节点的z的父结点设为新的当前节点,并以新当前节点为支点左旋。将情况2转化为情况3。

这里写图片描述

情况3:z的父结点为红色,而z的叔叔结点y是黑色,而且z是左孩子:此时将z的父节点修改为黑色,祖父节点变为红色,并以祖父节点为支点进行右旋操作。此时一行中不再有两个连续的红色结点,红黑树所有性质调整完成,因此所有的处理到此完毕。

这里写图片描述

(2)删除

情况1:x的兄弟结点w是红色的:此时需把父结点修改成红色,把兄弟结点w修改成黑色。然后,针对父结点进行左旋操作,此时红黑树性质5不变。将情况1转化为其他情况。

这里写图片描述

情况2:x的兄弟w是黑色的,而且w的两个孩子都是黑色的:此时需从当前结点x和兄弟节点w去掉一重黑色,从而x只有一重黑色而w是红色。同时为了补偿去掉的一重黑色,需在x的父结点上增加一重黑色,并把x的父结点作为新的当前节点,重新进入循环。

这里写图片描述

情况3:x的兄弟w是黑色的,w的左孩子是红色的,右孩子是黑色的:此时需把兄弟结点w修改成红色,兄弟w的左孩子修改成黑色,然后以兄弟结点w作为支点进行右旋操作,之后重新进入算法。将情况5转化为情况6。

这里写图片描述

情况4:x的兄弟w是黑色的,而且w的右孩子是红色的:此时需将兄弟结点w修改成x的父结点的颜色,然后将x的父结点修改成黑色,兄弟结点w的右孩子修改成黑色,然后以x的父结点为支点进行左旋操作。此时算法结束,红黑树所有性质调整完成。

这里写图片描述

3、红黑树与AVL树的对比

1. 如果插入一个node引起了树的不平衡,AVL和RB-Tree都是最多只需要2次旋转操作,即两者都是O(1);但是在删除node引起树的不平衡时,最坏情况下,AVL需要维护从被删node到root这条路径上所有node的平衡性,因此需要旋转的量级O(logN),而RB-Tree最多只需3次旋转,只需要O(1)的复杂度;

2. 但是由于红黑树没有AVL树那么高度平衡,所以红黑树的查找性能相比AVL树要差一些,查找上的这一点性能差相比数据的插入和删除时的旋转性能是值得的,这就是为什么很多场合是用的红黑树,而不是AVL树,例如STL中的map和set因此,RB-Tree在需要大量插入和删除node的场景下,效率更高。自然,由于AVL高度平衡,因此AVL的search效率更高。

转自:https://www.cnblogs.com/xlzhh/p/4222957.html
https://blog.csdn.net/mmshixing/article/details/51692892

猜你喜欢

转载自blog.csdn.net/daaikuaichuan/article/details/80778923
今日推荐