认识红黑树RBTree

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
参考:维基百科
参考:https://baike.baidu.com/item/红黑树?fr=aladdin
参考:https://www.jianshu.com/p/e136ec79235c

红黑树RBTree—早有耳闻。之前大学学数据结构的时候,学了平衡二叉树,红黑树不太有印象,工作中没有需要自己开发,也就没有细去了解,本来想等有需要自己写的时候再看,今天忍不住,还是去查了些资料了解了解,也挺有趣的。

1. 认识变化的点

对自己之前的认识产生改变的点有:
红黑树是平衡二叉树的变体,但不是严格的平衡二叉树:它的两边的深度时常会大于1,但一边不会超出一边1倍深度。。。

2. 红黑树的关键特点

前置一个特点:叶子节点指空节点,每个带数据的节点都是叶子节点的上层节点。

关键特点:

  • 每个节点都有颜色,红色或黑色
  • 三个黑色设定:根节点是黑色,叶子空节点是黑色,红节点下面都是黑色节点
  • 红黑树所有叶子空节点的上层黑色节点数目总是一致的—这个也是确保它平衡的关键点

其它推导特点或过程特点:

  • 每次加一个非空节点时,所加节点置为红色,如果和上层同色或是根节点情况才需要调整(旋转,调整颜色等处理)
  • 黑色节点下,不要求是什么颜色节点,可黑可红:例如根节点是黑色的,它的左右节点可红可黑,例如叶子空节点是黑色的,它的父节点可红可黑。
  • 红色节点下不能是红色节点,这个也是添加或删除数据才会发生的情况,发生了就需要触发调整(旋转,调整其它节点颜色等处理)
3. 来看几个问题
  • 红黑树为什么左右子树一边不会超过一边一倍深度?
    红黑树添加节点过程中,保证了所有叶子节点到根节点之间,黑色节点的数目一致,差别是红色节点数目不同,而红节都是被黑节点隔开的,所以红节点的数目是不会超出黑节点数目的,也就保证了深度不会超出一倍。

  • 加节点时,所加节点上父节点是黑色节点时,为什么不用调整?
    添加节点时,所选取位置必定是原叶子空节点-黑色所在位置,节点添上去是红色节点,下面产生左右两个黑色叶子空节点。等于说黑节点数目从叶子节点往上数,数目不变化,所以不用调整。

4. 插入数据时的旋转特点

也前置一个特点:插入节点均预设为红色(这样的好处时,红色不占用红黑树的平衡统计层数,不会因为插入节点,导致到跟节点的黑色节点数目变化)
不需要旋转的情况

  • 没有节点时,插入节点修改为黑色,满足跟节点黑色的设定
  • 插入节点除首个节点外,都位于叶子空节点所在位置,父节点为黑时,不需要旋转

需要旋转的情况:插入叶子节点位置的父节点也为红色,违反红色节点下全黑色约束,这种情况需要考虑父节点的兄弟节点,综合考虑有两种情况:
关键变动节点4个[当前节点,父节点,父节点兄弟,祖父节点]
变动前 [当前节点-红,父节点-红,父节点兄弟-黑/红,祖父节点-黑]

  • 父节点兄弟节点是黑色:4个节点中2个红节点,这种情况好说,一种当前节点在左,旋转一下,把父节点转到祖父节点位置-变黑,祖父节点变红。样子从两个红色相连,变为一黑下面左右各一个红色;一种当前节点在右,先旋转下,把当前节点转到父节点位置,然后按照前一种方法处理。
    变动后1-[原当前节点-红,原父节点-黑,原父节点兄弟-黑,原祖父节点-红]
    变动后2-[原当前节点-黑,原父节点-红,原父节点兄弟-黑,原祖父节点-红]
  • 父节点兄弟节点是红色:4个节点中3个红节点,这种情况下:祖父节点直接变红,父节点与父节点兄弟节点变黑–祖父节点变红换掉它的子节点的红色;
    同时由于祖父节点变红,向上层产生了冲击,相当于该位置插入了红节点,递归回到了插入数据判定—就好像该位置为叶子时插入一个红节点。
    变动后-[当前节点-红,父节点-黑,父节点兄弟-黑,祖父节点-红]同时向上递归,传递祖父节点插入红节点变更

考虑这种变换的方法,除了根节点颜色不断转换产生叶子节点黑色深度增加外,其它情况均不会产生黑色深度增加,而推动根节点颜色变化来源于—一侧数据增加引起的路径上红色节点满载,所以实现了较少的判定就完成了插入数据自平衡过程。

5. 其它

ps. 另外想到一个点,对于红黑树或其它树结构,如果删除不频繁情况,对于删除的数据,也可以考虑标记删除方法,只标记,不真实把节点从树中拿掉,这样删除效率应该会很好,对添加、查询也都影响不大,当然内存占用会稍大一点。

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

春夜喜雨

稀罕你的喜欢!!

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

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

打赏作者

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

抵扣说明:

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

余额充值