红黑树底层实现!

如果想了解 红黑树 那么必须要先知道什么是二叉树 因为红黑树就是二叉树的衍生品

  • 那么二叉树具备哪些特性?
    1.左 边树上的节点的值都小于或等于它的根节点;
    2.右 边树上的节点的值都大于或等于它的根节点;
    比如:根节点是50,然后左边的子节点是40 . 30 . 20 等等…,那么我们需要查一个值 这个值为:60,那么 二叉树只需要先跟 根节点对比判断 如果我们查的这个值是大于根节点 那么二叉树 就直接去了右边的子节点,因为左边的节点全部是小于或者等于根节点的 所以完全就不会走左边。同样的道理 去了右边之后依次对比,是大于还是小于 是走左还是走右 这样一直对比查下去;
    在这里插入图片描述

    因为二叉树 也是有缺陷 所以才诞生了红黑树,就比如 在插入节点的时候,我们根节点是9,左子节点是8,右子节点是12,那么我们需要依次插入五个节点:7,6,5,4,3.那么按照二叉树的特性 它会变成什么样子?就变成了单叉书了
    在这里插入图片描述
    所以这样 红黑树就诞生了
    那么红黑树有一下特点:

    • 1.节点是只有二种颜色,要么红,要么黑;
    • 2.主根节点一定是黑色的
    • 3.每个 叶子 节点是黑色的(为null,或者为零的节点都称为 叶子 节点)
    • 4.每一个红色节点过后它下面的二个节点一定时黑色的节点(然而从每个叶子节点到根节点的所有路径上不能出现有两个连续的红色节点)
    • 5.从任何一个节点到每个叶子节点的所有路径都包含相同数目的黑色节点(就是说从根节点到叶子节点不管走那一天黑色节点数目一定要相同)
      在这里插入图片描述

1.向红黑树插入值为:14的节点
在这里插入图片描述
因为14比15小,所以它一定在节点的15根节点的左边,当前插入没有破坏红黑树的规则所以不需要做任何的调整.

2.向红黑树插入值为:21的节点
在这里插入图片描述

  • 由于父节点22是红色的打破了规则4(每个红色节点下的子节点必须是黑色的,而且红色节点不能连续出现2个)所以必须要进行调整,使其符合红黑树规则.
  • 调整红黑树有两种方法: 1. 变色; 2. 旋转(旋转有左旋转跟右旋转);

变色:
为了重新符合红黑树的规则,那么先尝试把红黑节点变为黑色,或把黑色变为红色;

下面如图表示红黑树的一部分,需要注意节点25并非根节点。因为节点21和节点22连续出现了 红色 不符合规则4,所以把红色变为黑色:
在这里插入图片描述
但是这样又出现了一个问题,凭空多出了一个黑色,打破了规则5,如:21的子叶子节点走到27的叶子节点 经过了4个黑色节点,那么21的叶子节点到22的叶子节点 只经过了3个黑色节点 所以这里打破了规则5(任何一个节点到每个叶子节点的所有路径都包含相同数目的黑色节点)在这里插入图片描述
在此修改颜色,但是还是出现问题,就是25和27又形成了连续2个红色节点,有打破了规则,那么咱们在吧27从红色变为黑色
在这里插入图片描述

左旋转:
逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为了自己左孩子.
在这里插入图片描述
图中,身为右孩子的Y取代了X的位置,而X变成了自己的左孩子。此为左旋转

右旋转:
顺时针旋转红黑树的两个节点,使得父节点被自己的左孩子取代,而自己成为了右孩子
在这里插入图片描述
我们以刚刚插入的21节点为例:
在这里插入图片描述
首先,我们需要做的是变色,把节点25其下方的节点变色:
在这里插入图片描述
那么此时17和25节点又是两个红色节点,那么把节点17变成合适节点?不太合适。这样打破了规则4,而且根据规则根节点一定是黑色,也不可能吧13变成红色

那么变色已经无法解决,现在只能用旋转,我们把13看做X,把17看做Y,如刚刚图一样
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

由于根节点必须为黑色,所以需要变色:
在这里插入图片描述
然而这样还是不符合规则,在下面的节点到跟节点需要4个黑节点,而其他只需要3个,那么我们还需要进行旋转
这次我们需要把节点13看做X,节点8看做Y 进行右旋转:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后在根据规则进行变色:
在这里插入图片描述
如此一来,我们红黑树重新变得符合规则,一共经历了如下步骤:
变色,左旋转,变色,右旋转,变色

红黑树应用场景:比如HashMap TreeMap TreeSet都用了红黑树

红黑树添加是很复杂的
画图就能慢慢了解 光看 了解不透的

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值