红黑树(RB-Tree)

本文详细介绍了红黑树的基本概念、性质及其插入删除操作的过程。同时,对比了红黑树与AVL树在不同应用场景下的优劣,指出红黑树更适合于频繁插入删除的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、定义

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

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

2. 根结点是黑色

3. 每个叶结点是黑的;

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

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

这里写图片描述

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

2、插入和删除

(1)插入

  情况1:插入结点z的父结点为红色,而z的叔叔结点y是红色将父节点和叔叔节点变成黑色,把祖父节点变为红色
这里写图片描述

  情况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.youkuaiyun.com/mmshixing/article/details/51692892

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值