数据结构-红黑树

红黑树定义及应用

  1. 本质上是二叉树,每个节点带有颜色属性,非红即黑
  2. 根节点是黑色的,叶子节点必须是值为空的黑色节点
  3. 红色节点不能连续出现
  4. 任意节点到叶子节点路径中经历的黑节点的数目是一致的
    红黑树的应用广泛:
    · 在C++的STL中。map和set都是用红黑树实现的。
    · 著名的linux2.6.23的进程调度1Completely Fair Scheduler(cfs),用红黑树来管理进程的调度,而不是通过队列。
    · epoll在内核中的实现,用红黑树管理事件
    · nginx中,用红黑树管理timer等
    · Java的TreeMap实现 jdk1.8 里面的 hashmap 的实现

红黑树VS平衡二叉树

红黑树是定义的第3,4条来实现树的平衡的,与平衡二叉树(AVL)有着异曲同工之妙,但红黑树插入效率更高,因为在同样的插入过程中,红黑树需要调整树结构实现自平衡的几率是AVL树的一半,当插入点是黑色时插入红色节点时不需要做任何调整的。

红黑树的关键实现

下面就红黑树(RBtree)的插入和树的调整的关键算法进行分析说明:

插入过程

  1. 直接插入 ,插入节点(父节点)是黑色,直接插入红色节点,无需做任何调整,所以一般新插入的节点都默认是红色的;
  2. 父节点是红色,叔叔节也是红色
    这种情况只需要通过变色来调整,将祖父节点变为红色,父节点和叔叔节点变为黑色,然后向上递归(循环)调整。
  3. 父节点是红色,叔节点是黑色
    这种情况稍微复杂点,需要通过调整节点位置和变色来保证RBtree的第3,4点属性。在此假如你已经了解左旋右旋的概念,不了解可以参考代码里的说明。
    新节点默认是红色,插入和调整过程如下(这里以左斜树为例):
    在这里插入图片描述
    具体分为以下几种情况:
    插入节点比父节点大,即在父节点的右子节点
    父节点比祖父节点小,即父节点在祖父节点的左侧
    即上图所示的情况,需要先经过左旋,然后右旋,最后进行一次变色,即可打完收工。纳里?为啥这么肯定已经调整完成了呢,不需要再向上检查树的平衡性了吗?聪明的呢可能已经心领神会,你看图中的状态1和状态5的红黑节点的结构是一致的,所以只要添加新节点前树是平衡的,状态5就是平衡的。为情况(1)。
    父节点比祖父节点大,即父节点在祖父节点的右侧
    此时直接左旋然后变色即可。此为情况(2)。

插入节点比父节点小,即在父节点的左子节点
父节点比祖父节点小,即上图从3到5的变化,只需要右旋和变色即可。此为情况(3),与情况(2)正好相反,我们称为互补。
父节点比祖父节点大,即在父节点在祖父节点的右边,这时需要先父节点右旋,再将祖父节点左旋,再变色即可。此为情况(4),与情况(1)互补。

红黑树删除

  1. 待删除点有两个子节点
    关键逻辑在确定后继节点,用后继节点代替删除节点,同时调整颜色以保证达到删除前黑色节点的结构和层次。当同时存在第一、二后继节点的时候,优先使用第二后继节点,示例如下:
    在这里插入图片描述

  2. 待删除有一个节点
    只有唯一情况,子节点是红色,删除后用子节点代替后调整为黑色。

  3. 待删除节点无子节点
    此种情况可以分为几种情况:
    先明确一下字母含义;
    FA:父节点,BR:兄弟节点,NE:侄儿节点,UN:叔叔节点,D:待删节点
    1.兄弟节点是黑色,侄儿节点是红色
    侄儿节点与兄弟节点同方向一致只需一次位置调整,否则需要两次位置调整,示例为左节点为待删节点,侄儿节点在兄弟节点的左边。
    在这里插入图片描述

2.兄弟节点黑色,无侄儿节点,父节点为红色
调整颜色即可,父节点为黑色,兄弟节点为红色
3. 兄弟为红色,侄儿节点为黑色
调整参考情况1
4.兄弟节点为黑色,无侄儿节点
先变色,父节点为黑色,待删节点和兄弟节点为红色,然后以父节点为待删节点而不真实删除,递归判断符合1~4的那种情况继续执行调整。

参考代码
https://github.com/smileclound/datastructure/tree/master/src/main/java/com/rbtree


  1. completely fair scheduler ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值