红黑树

简介

红黑树是一种特殊的二叉搜索树

相较于平衡二叉树,在综合性能上红黑树更为优秀。只要满足红黑树的条件,我们就可以达成一颗近似平衡的二叉树

我们在Jdk1.8版本后,我们能发现的HashMap的数据结构从数组加链表的形式转化为数组加链表加红黑树的形式,为的就是通过一颗相对平衡的二叉树来提高搜索效率。

红黑树的基本条件

  • 树根为黑色
  • 不能有连续的两个红色
  • 所有NULL节点(叶子节点)都为黑色
  • 所有节点到叶子节点的路径上的黑色节点数量相同

红黑树的搭建

所有新插入的节点默认为红色(因为插入黑色必定会破坏红黑树性质导致重新平衡转换,而红色可以减少这样的次数)

  • 插入节点为根节点:直接插入
  • 插入节点的父节点为黑色:直接插入

以上两种情况都不需要进行调整

插入节点的父节点为红色

这个时候分成三种情况(有人分为五种情况,我认为是三种,这样更容易记忆)

1.叔叔节点为红色

当父亲为红时爷爷节点一定为黑,否则不符合红黑树条件

调整方式:父亲节点和叔叔节点都变成黑色,爷爷节点变成红色

2.叔叔节点为黑色,插入的节点在外侧

图中这种情况我称之为外侧

调整策略:

父亲节点和爷爷节点换色,然后以爷爷节点为旋转点向着另一侧没有插入节点的一侧旋转

2.叔叔节点为黑色,插入的节点在内侧

 

图中这种情况我称之为内侧

调整策略:

父节点和插入节点换位,即以父节点为旋转点向外侧旋转,转成上一种外侧情况,再按照外侧情况进行调整


红黑树的删除

相较于搭建,红黑树的删除会稍微复杂一些

当我们删除节点后我们一般要选择删除节点的后继节点来顶替被删除的位置,同时要转换为被删除节点的颜色
这个过程其实相当于删除了后继节点

所以我们将以后继节点的位置作为调整的位置

  • 当后继节点为红色时,直接删除
  • 当后继节点为黑色时,我们需要进行树的重新调整,因为一个黑色节点的消失意味着这条路径上的黑色节点数量于其他路径长度不一致

接下来讨论后继节点为黑色时我们的调整策略

1.兄弟节点为红色

  1. 父亲节点和兄弟节点换色
  2. 向被删除一侧旋转补齐

2.兄弟节点为黑色

2.1

  1. 兄弟节点变红

2.2

  1. 兄弟节点和红色侄子节点换色
  2. 兄弟节点向外侧旋转
  3. 父亲节点变黑色,新兄弟节点变红色
  4. 父亲节点向被删除一侧旋转
  5. 新红色侄子变黑

2.3

  1. 父亲节点变黑色,兄弟节点变红色
  2. 父亲节点向被删除一侧旋转
  3. 红色侄子变黑

2.4

  1. 父节点和叔叔节点换色
  2. 父亲节点向被删除一侧旋转
  3. 外侧红孩子变黑
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原来是肖某人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值