数据结构与算法——红黑树的实现

Posted coocochoco

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法——红黑树的实现相关的知识,希望对你有一定的参考价值。

有了二叉搜索树为什么还要红黑树,以下面几个例子举例,如下面的二叉树可以达到很好的搜索效果

5 7 11 15 19 21 25 26 61 99

 

 

技术图片

 

 再看下面这棵树,我们将下面的数据按从左至右的顺序构造一棵二叉搜索树

15 13 16 11 9 7 5 3

 

 

按照之前我们二叉搜索树构建构建的方式,我们将得到下面这样一棵树:

技术图片

 

 如果找值为 3 的节点,9 个节点需要比较的次数是 7 次,同样的数据,如果我们按照以下顺序构造一棵二叉排序树:

9 5 13 7 3 11 16 15

 

 

技术图片

则查找值为 3 的节点,9 个节点需要比较的次数是 3 次,两者之所以达到了如此之大的差距,原因是第一棵树左右不够平衡,导致出现比较极端的情况。

 

解决方案: 红黑树

红黑树每个节点都带有颜色属性(颜色为红色或黑色)的自平衡二叉查找树,满足下列性质:

红黑树是一种自平衡二叉查找树,从下面红黑树的图可以看到,根结点右子树显然比左子树高,但左子树和右子树的黑结 点的层数是相等的,也即任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点。所以我们叫红黑树这种平衡为 黑色完美平衡。

1 它是一个自平衡二叉搜索树,满足二叉搜索树的条件;

2 节点是红色或黑色;

3 根节点是黑色;

4 所有叶子节点都是黑色;

5 每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节 点。)

6 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

技术图片

 

以上例数组为例构建红黑树:

15 13 16 11 9 7 5 3

 

 

 

第一步:使用第一个元素 15 创建根节点,根节点一定是黑色,如图:

技术图片

 

 

第二步:将 13 加入到红黑树,按照二叉搜索树的规则,13 应插入到 15 的左子节点上面,此时插入红色节点不会破坏红黑 树的平衡,直接插入即可,如图:

技术图片

 

 第三步:将 16 加入到红黑树,16 应插入到 15 的右子节点上面,此时插入红色节点不会破坏红黑树的平衡,直接插入即 可,如图所示:

技术图片

 

 

 第四步:将 11 加入到红黑树,11 应插入到 13 的左子节点上面,此时继续插入红色节点会破坏红黑树的平衡规则,红色 节点下必须是一对黑色子节点,而插入黑色节点也违背了规则 5(从任一节点到其每个叶子的所有简单路径都包含相同数 目的黑色节点),所以必须进行如下特殊处理:

1. 将 11 的父节点 13 和叔父节点都设置为黑色

技术图片

 

第五步: 将 9 加入到红黑树,9 应插入到 11 的左子节点上面,此时无论插入红色节点或黑色节点都会破坏规则,必须对节 点做挪移处理:

技术图片

 

第六步:将 7 加入到红黑树,7 应插入到 9 的左子节点上面,此时无论插入红色节点或黑色节点都会破坏规则,必须对节 点做变色处理:

技术图片

 

第七步:将 5 加入到红黑树,5 应插入到 7 的左子节点上面,此时无论插入红色节点或黑色节点都会破坏规则,必须对节 点做旋转处理:

技术图片

 

第八步:将 3 加入到红黑树,3 应插入到 5 的左子节点上面,此时无论插入8红9色79节4点3或84黑0色1节1点1都1会破坏规则,我们先对 父节点和叔叔节点做变色处理:

技术图片

 

但这样破坏了红色节点 11 必须有两个黑色子节点的规则,因此还得进一步向上调整,此时,要保障红黑树的平衡,我们需 要对根节点进行右旋!

技术图片

 

 

 

  

 

以上是关于数据结构与算法——红黑树的实现的主要内容,如果未能解决你的问题,请参考以下文章

数据结构备忘录:红黑树的插入与删除

Java数据结构与算法解析——红黑树

Java数据结构与算法解析——红黑树

红黑树插入与删除完整代码(dart语言实现)

数据结构 - 红黑树(Red Black Tree)删除详解与实现(Java)

了解红黑树的起源,理解红黑树的本质