到底什么是红黑树?

到底什么是红黑树?

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

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个规则的二叉排序树就是红黑树:
规则一: 所有节点非黑即红,没有其他的颜色
规则二: 根节点都为黑色
规则三: 叶子节点(即空节点)都为黑色
规则三: 每个红色节点的两个子节点都是黑色。
规则四: 从任一节点到其每个叶子的所有路径都包含“相同数目的黑色节点”

举个例子,红黑树如下图所示。
在这里插入图片描述
之所以要设置以上几条规则,是为了防止红黑树退化成一条单链表,影响查询效率。Java在JDK1.8中为了防止哈希冲突形成的长单链表,就把单链表转换成红黑树的数据结构,以提升查询的效率。
8.那么如何把一棵不平衡的数,变成红黑树呢?
主要是有两个方法:
1.变色
2.旋转(包括左旋转和右旋转)
(一般来说,先变色,看下符不符合规则,变到没法再变色了,就旋转,旋转看下规则的要求是否需要变色)
红黑树漫画讲得很好

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值