数据结构与算法之树

简介: 红黑树1.如果一个树要是红黑树,那么这个树首先就要满足平衡二叉树的性质。

红黑树

1.如果一个树要是红黑树,那么这个树首先就要满足平衡二叉树的性质。

为什么需要平衡二叉树呢???
  也许在我们在构建树的时候会发生如下的情况

       20191021184503315.png                                      


这种情况根本就体现不出我们用树的好处所在了,所以为了避免这种情况的发生,我们希望能有一种算法,将上述情况的转化为平衡二叉排序树,这样就可以让我们的二叉排序树的结构达到最优化的状态。

所以我们就有了平衡因子的概念。


平衡因子:   左右子树的高度之差。 
    当高度之差 大于1时我们就需要进行旋转了。

接下来给大家介绍一下平衡二叉树的旋转(红黑树的旋转也是和这个一样的)。


右旋的情况


  1. LL型(右旋):此时平衡因子大于1.所以我们现在就要进行旋转了,方法如下。
    以B为支点让A进行右旋

20191021185533361.png

2.LR型(先转换成LL型在右旋):

首先我们交换B、C的位置,由性质我们知道此时B小于C所以此时我们的C就会在B的左边,就会变成第二个图片所示,现在就变成了我们的第一种情况(LL型了。我们只需要让其右旋就可以使平衡因子的绝对值不大于1)


       20191021185803454.png                        

左旋的情况!

1.RR型(左旋):RR型其实和LL行的型的情况的情况相反 我们只需要逆向思考就行。以B为支点让A进行左旋


20191021190402479.png

2.RL型: 首先我们交换B、C的位置,由性质我们知道此时B大于C所以此时我们的C就会在B的右边,就会变成第二个图片所示,现在就变成了我们的第一种情况(RR型了。我们只需要让其右旋就可以使平衡因子的绝对值不大于1)

20191021190757342.png


以上就是旋转了。

通过以上方法我们就能完成对平衡二叉排序树的构建,那么接下来我们来介绍一下红黑树:

红黑树的性质:


1)节点是红色或黑色;

2)根节点是黑色;

3)所有叶子节点都是黑色节点(NULL);

4)每个红色节点必须有两个黑色的子节点(如果叶子结点是红色,那么我的黑色结点可以不画出来)。(从每个叶子到根的所有路径上不能有两个连 续的红色节点。)

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


我们来介绍一下红黑树的旋转吧:


左旋:我们现在旋转方框所示。现在进行左旋。

首先我们能将E作为支点把B进行左旋,此时会遇到B和F抢夺位置,因为B小于F所以我们将F移动到B的右侧.如中间所示,然后再让A链接E,即完成左旋。

20191021192737217.png


右旋的思想概念和左旋一样,就行读者自己理解了(不好画图。。。。体谅一下。)

红黑树的插入:

注意!!!!   我们插入的一般是红色节点(可以减少调整次数)。
Q:那么当我们插入一个红色节点后,可能会使原树的那些性质发生改变?
A:1. 如果插入的节点位置是根节点,则性质2会受到破坏
   2. 插入的节点的结点是红色,则会破坏性质四。


总而言之: 当我们插入一个红色节点,只会破坏性质2 和性质4

那么我们只需要准备好对应的修复方法即可使其再次成为红黑树。


      下面是会遇到的情况!


1.情况1:插入的是根节点。

原树是空树,此情况只会违反性质2。


对策:直接把此节点涂为黑色。


2.情况2:插入的节点的父节点是黑色。

此不会违反性质2和性质4,红黑树没有被破坏。


对策:什么也不做。


情况3:变化前[当前结点为4节点]:

3.当前节点的父节点是红色且祖父节点的另一个子节点(叔叔节点)是红色。

此时父节点的父节点一定存在,否则插入前就已不是红黑树。与此同时,又分为父节点是祖父节点的左子

还是右子,对于对称性,我们只要解开一个方向就可以了。 在此,我们只考虑父节点为祖父左子的情况。

同时,还可以分为当前节点是其父节点的左子还是右子,但是处理方式是一样的。我们将此归为同一类。

20191021200656646.png

对策:将当前节点的父节点和叔叔节点涂黑,祖父节点涂红,把当前节点指向祖父节点,从新的当前节点重新开始算法。


按照我们上面的操作步骤可以得到(下面画方框的是经过我们的步骤后所得到的效果)。此时他依然不是红黑树,那么我们还需要继续进行变色。


20191021194216588.png


  1. 情况4:[当前节点为7节点]:
    当前节点的父节点是红色,叔叔节点是黑色,当前节点是其父节点的右子

20191021194553959.png

对策:当前节点的父节点做为新的当前节点,以新当前节点为支点左旋。

如下图所示,


变换之后

20191021195043675.png

可以看出经过死的变换依然不满足红黑树的性质。那么我们在经过左后一步即可得到一个红黑树,那就是步骤五。


  1. 情况5:[当前节点为2节点]
    当前节点的父节点是红色,叔叔节点是黑色,当前节点是其父节点的左子

2019102119533829.png

对策:父节点变为黑色,祖父节点变为红色,把祖父节点右旋

       20191021195824345.png                        

此时的树就完全满足了红黑树的性质,此时插入完成!!!!


那么现在我们就能对红黑树的插入进行总结了!!!!


经过上面情况3、情况4、情况5等3种插入修复情况的操作示意图,大家应该能发现,后面的情况4、情况5都是针对情况3插入节点4以后,进行的一系列插入修复情况操作。同样的。你可以认为:整个变换过程下来,情况3、4、5就是一个完整的插入修复情况的操作流程(读者们如果遇到情况三那么就可以直接将套用我们的345修复情况。)情况四、五也是独立的情况,不要误认为只有在情况三发生之后才会遇到情况四和五。


现在就先写到红黑树的插入的,后面的删除部分比较复杂,下面的博客再给大家分享。


目录
相关文章
|
1月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
99 64
|
11天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
54 16
|
7天前
|
算法
树的遍历算法有哪些?
不同的遍历算法适用于不同的应用场景。深度优先搜索常用于搜索、路径查找等问题;广度优先搜索则在图的最短路径、层次相关的问题中较为常用;而二叉搜索树的遍历在数据排序、查找等方面有重要应用。
14 2
|
1月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
18 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
1月前
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(三)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
|
1月前
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(二)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
|
1月前
|
存储
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(一)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
|
1月前
|
Java C++
【数据结构】探索红黑树的奥秘:自平衡原理图解及与二叉查找树的比较
本文深入解析红黑树的自平衡原理,介绍其五大原则,并通过图解和代码示例展示其内部机制。同时,对比红黑树与二叉查找树的性能差异,帮助读者更好地理解这两种数据结构的特点和应用场景。
25 0
|
1月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
23 0