到底什么是红黑树?

到底什么是红黑树?

首先,可以这么简单粗暴的理解,红黑树≈平衡的二叉排序树。
那么很显然,要想弄懂红黑树,得先明白什么是树、二叉树、二叉排序树、平衡树以及不平衡树。下面我们一个个来了解。

1.第一个问题,什么是树?
树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。(如下图所示)
它具有以下的特点:每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树。节点里面可以存储数据,文件等,下图的节点为空,没有存放东西,仅做举例子。
在这里插入图片描述

2.第二个问题,什么是二叉树?
二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”。如下图所示在这里插入图片描述

3.第三个问题,什么是排序二叉树?
二叉树指的是一棵树,只有两个孩子,两个分叉,而进一步地,排序二叉树就这棵树的左子树比右子树都要小,就叫排序二叉树。
在这里插入图片描述

4.第四个问题,什么是平衡树?什么是不平衡树?
下面的两张图,可以让大家非常直观的观察到,平衡树与不平衡树之间的差别了。

在这里插入图片描述
在这里插入图片描述
5.那么红黑树是用来干什么的呢?
当向二叉排序树插入元素或者删除元素的时候,导致排序二叉树变得不平衡了,这时候就需要红黑树来解决这个问题来让这棵树变得平衡了。而红黑树正是解决这个不平衡问题而诞生的。

6.那么有的朋友又会问,为什么要解决这个不平衡的问题呢?

这是因为啊,之所以需要二叉排序树,是因为他这里利用了折半查找(也叫二分查找)的思想,所以利用这种数据结构进行查找的时候,查找的速度会非常的快速,如下图所示。在一个存储4,5,6,10,14,15,18的树形结构里面,假设我们要查找14,我们只要先找到10,再找到15,最后就可以找到14,一共只需要查找3次,就可以找到目标节点,假若是按照顺序查找从左到右顺序则要找5次,明显是前者的查找方式比较快。另外,由于这只是比较简短的数据,如果是更大量的数据,则前者的查找方式将会显得更加的快速。
在这里插入图片描述
那么现在,回到我们上面的问题,为什么要解决这个不平衡的问题呢?这是因为当二叉排序树不平衡的时候,查找的速度会非常的慢,例如下图一棵不平衡的树所示。当我们如果一棵树的一边及其的不平衡,并且不平衡得像一个线性结构一样(例如下图),下图的左子树几乎变成了线性结构,相当于改变了它原本的树形结构。如此一来,这时候很明显会大幅降低查找速度,所以这时候就需要红黑树根据一定的规则来把不平衡的树变得平衡,从而保持查找的高速度。
在这里插入图片描述

7.说了这么久,那到底什么是红黑树呢?
回到本文第一句话,可以这么简单粗暴的理解,红黑树≈平衡的二叉排序树。
红黑树具有下面5个规则,符合这5个规则的二叉排序树就是红黑树:
**规则一:**所有节点非黑即红,没有其他的颜色
**规则二:**根节点都为黑色
**规则三:**叶子节点(即空节点)都为黑色
**规则三:**拥有两个黑色子节点的即是红色节点
**规则四:**从任一节点到其每个叶子的所有路径都包含“相同数目的黑色节点”

举个例子,红黑树如下图所示。
在这里插入图片描述
8.那么如何把一棵不平衡的数,变成红黑树呢?
主要是有两个方法:
1.变色
2.旋转(包括左旋转和右旋转)

给自己加油,保持每天都学习,每天都更新博客!
信Java得永生!

猜你喜欢

转载自blog.csdn.net/weixin_43774841/article/details/91356740