RBTree-红黑树

什么是红黑树

红黑树也是一颗二叉搜索树
在这里插入图片描述

图上有几条路径呢?

11条路径,根到空节点算一条路径

红黑树能做到最长路径不超过最短路径的2倍,达到近似平衡
也就是说AVL树的最小高度差为什么非得是1,2/3…行不行?
红黑树认为AVL树太严格控制平衡了,旋转的过程是要付出代价的。
但你要控制高度超2/3很难去控制,红黑树通过颜色控制而不是高度差。

红黑树的性质

  1. 每个结点不是红色就是黑色
  2. 根节点是黑色的
  3. 如果一个节点是红色的,则它的两个孩子结点是黑色的 (任何路径没有连续的红色节点,但是允许有连续的黑色节点且满足路径黑色节点数相同的条件下)
  4. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点 (直接从根节点往下看,每条路径上黑色节点的数量相等)
  5. 每个叶子结点都是黑色的(此处的叶子结点指的是空结点) (只是为了更好的帮助我们理解路径的概念)

这几点规则是互斥的。

控制住这几条性质,我们就控制住了红黑树最长路径不超过最短路径的2倍,就控制住了红黑树达到近似平衡。

红黑树如何控制高度差不超过最短的2倍 ?
依照这几条互斥的规则控制树的高度,而且插入过程中是会旋转的。

按这颗树来举例估算AVL树和红黑树之间的性能差距,为什么说红黑树反而更优呢?

在这里插入图片描述
极限情况下
最短路径会是全黑的
最长路径 只能往黑的里面塞红的,塞黑的就会与性质4冲突,则最长路径就是一黑一红相间的路径,还只能塞一个红,两个红会违反性质3.

我们大概估算,把所有黑节点都拿出来会是一颗近似完全二叉树。
如果AVL树一共有1000个节点,红黑也有1000个
把红黑所有的黑节点拿出来就按1000算高度h=logn = 10
红黑树最长路径是最短的2倍,h = 20
在这里插入图片描述

这里就简单理解为红黑树的操作高度次是AVL的操作高度次的2倍,在CPU看来没什么区别。

红黑树实现

红黑树的节点也需要三叉链,并且需要颜色枚举
在这里插入图片描述

插入

红黑树的插入,因为红黑树也是二叉搜索树,所以前半部分插入逻辑和搜索树一样,但需要引入颜色控制。

我们插入一个新节点,我们插入红的还是黑的呢?
我们讲的性质最重要的是3 和 4,你要插入新节点注定要违反规则
在这里插入图片描述
如果插入黑色节点,这是很不理性的,它破坏了性质4,破坏了每条路径上黑色节点数量相等,你还要去每条路径上去补黑色节点吗?

所以要插入红色节点,它不会影响其他路径,但是可能会影响当前路径。比如右边规则3就被违反了,但是左边插入到黑色节点下刚刚好。
在这里插入图片描述
插入红节点如果父亲是红那一定存在爷爷节点且是黑色,则这种情况不可能没有爷爷。

黑色节点多是有好处的,方便红色的直接插入

首先看parent的颜色

结束


再看叔叔
这里又分为父亲是爷爷的左 or 爷爷的右
以左为例子,看叔叔,如果叔叔存在且为红,那么变色 + 继续向上处理。
如果叔叔不存在 或 存在且为黑,那么要根据 爷爷 父亲 和 当前cur节点(它可能是被下面变色引发的 也可能就是新插入节点)的位置关系来判断是 单旋 还是 双旋,旋转平衡以后需要维护颜色关系变化,让中间节点是黑色,其他两个是红色。
在这里插入图片描述

如果父亲是爷爷的右,那么就反过来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
红黑树(Red-Black Tree)是一种自平衡的二叉查找树,具有良好的平衡性质。 红黑树在每个节点上增加了一个额外的属性来存储节点的颜色,可以是红色或黑色。红黑树必须满足以下五个性质: 1. 每个节点都有一个颜色,要么红色,要么黑色。 2. 根节点是黑色的。 3. 所有叶子节点(NIL节点)都是黑色的。 4. 如果一个节点是红色的,则它的两个子节点都是黑色的。 5. 对于每个节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数量的黑色节点。 这些性质保证了红黑树的平衡性,并且使得最长路径不超过最短路径的两倍。 红黑树的基本操作包括插入、删除和查找。插入操作通过调整节点颜色以及旋转来保持树的平衡;删除操作通过调整节点颜色以及旋转来保持树的平衡,并且在删除节点后需要考虑如何保持红黑树的性质。查找操作沿着树进行比较,最终找到目标节点或者确定目标节点不存在于树中。 红黑树的时间复杂度为O(log n),其中n为树中节点的个数。因此,红黑树在需要频繁地插入、删除和查找元素的情况下,能够保持较好的性能。 红黑树广泛应用于操作系统中的进程调度、文件系统的数据存储等领域,在STL中也有着重要的应用。它是一种非常重要且高效的数据结构,在算法和数据结构领域具有重要的研究价值和应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值