红黑树透析

红黑树(Red-Black Tree)是一种自平衡的二叉搜索树(Balanced Binary Search Tree),在计算机科学中被广泛用作一种高效的数据结构。(前提:二叉搜索树:左节点<根节点<右节点)

一、定义与性质

红黑树是一种二叉查找树,它满足以下五条性质,这些性质确保了树的平衡性:

  1. 节点颜色:每个节点非红即黑。
  2. 根节点黑色:根节点必须是黑色。
  3. 红色节点限制:红色节点的子节点必须是黑色(不能有两个连续的红色节点)。
  4. 每条路径黑节点数相同:从任意节点到其后代的所有叶子节点(叶子节点为NULL节点)经过的黑色节点数必须相同。
  5. 叶子节点是黑色:所有的叶子节点(NULL节点)都是黑色。

 

 二、插入

新节点的插入

  1. 新节点的颜色:新插入的节点通常被设为红色。这是因为如果新节点设为黑色,可能会破坏性质三(所有根到外部节点的路径上黑色节点的数目都相同)。而设为红色则只需要在必要时通过旋转和重新着色来调整树,以保持红黑树的性质。
  2. 插入位置:新节点被插入到二叉搜索树中应该出现的位置,即保持左子树小于根节点,右子树大于根节点的性质。

插入后的调整

插入新节点后,可能需要通过旋转和重新着色来调整树,以保持红黑树的性质。调整过程主要包括以下几种情况:

  1. 新节点是根节点:如果新节点是根节点,则直接将其设为黑色,因为根节点必须是黑色。

  2. 新节点的父节点是黑色:如果新节点的父节点是黑色,则不需要进行任何调整,因为此时红黑树的性质仍然满足。

  3. 新节点的父节点和叔节点(父节点的兄弟节点)都是红色:在这种情况下,需要将父节点和叔节点设为黑色,将祖父节点(父节点的父节点)设为红色,并以祖父节点为当前节点继续进行调整。

  4. 新节点的父节点是红色,叔节点是黑色:这种情况下需要根据新节点是父节点的左孩子还是右孩子,以及父节点是祖父节点的左孩子还是右孩子,分为四种情况进行处理。具体处理过程包括旋转和重新着色操作,以恢复红黑树的性质。

  • LL型(左-左):当前节点是父亲的左孩子,父亲是祖父的左孩子。处理思路是:将祖父节点右旋,然后交换父节点和祖父节点的颜色。
  • LR型(左-右):当前节点是父亲的右孩子,父亲是祖父的左孩子。处理思路是:先将父节点左旋,使当前节点成为新的父节点,然后再按照LL型处理。
  • RL型(右-左):当前节点是父亲的左孩子,父亲是祖父的右孩子。处理思路是:先将父节点右旋,使当前节点成为新的父节点,然后再按照RR型处理。
  • RR型(右-右):当前节点是父亲的右孩子,父亲是祖父的右孩子。处理思路是:将祖父节点左旋,然后交换父节点和祖父节点的颜色。

 需要注意的是在红黑树中的空节点默认是黑节点。

 

三、删除

  • 没有孩子-直接删除
  • 只有左子树/只有右子树-直接代替被删除节点的位置
  • 左右子树都有 -直接后继(或前驱)(就相当于找左子树的最大节点或右子树的最小节点)代替值,然后删除该值(转换成前两种情况)

操作方法:

没有孩子:

        红节点:直接删除(不会改变红黑树性质)

        黑节点:删除后改为双黑(不改变黑路同的性质)

                兄弟是黑节点: 

                                至少有一个红节点:(LL、RR、LR、RL)变色+旋转;变色需注意:RR、LL型的变色是:自己子节点的颜色变为自己的颜色,自己的颜色变为自己父节点的颜色,此刻父节点变黑色。LR、RL型的变色:自己子节点颜色变为自己的父节点的颜色,自己父节点的颜色变为黑色。

                                兄弟的孩子都是黑色:兄弟变红,双黑属性上移,此刻红黑树依然存在双黑节点需要继续进行判断直到变为单黑节点才可以。上移发现是红节点直接变单黑即可(抵消)。遇到根节点时也需要变为单黑即可(在所有黑路同的路径上都增加一和都减少以并不改变红黑树的性质)。

                兄弟是红节点:兄弟和父亲变色,向双黑旋转。

只有左子树/只有右子树- 代替后颜色变为黑色(因为需要保持红黑树的性质所以只有这种情况满足直接变黑)

建议直接看视频:红黑树 - 删除_哔哩哔哩_bilibili

(太复杂了看会了也容易忘记)

四、查找

根据红黑树满足的左节点<根节点<右节点的性质,在查找过程中,从根节点开始,根据目标键值与当前节点的键值进行比较,决定向左子树还是右子树递归查找,直到找到目标节点或到达叶子节点(NIL节点)为止。

最后,还是不明白的话推荐视频:红黑树 - 定义, 插入, 构建_哔哩哔哩_bilibili

(一遍就看明白啦)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值