数据结构:红黑树

参考:【老实李】JDK1.8中HashMap的红黑树

参考:红黑树的插入过程(图解)

参考:HashMap—红黑树算法结构详解

参考:红黑树(一)之 原理和算法详细介绍

1.红黑树介绍

1.1二叉查找树

介绍红黑树前先要理解什么是二叉查找树。

二叉查找树
二叉查找树

(1)左子树上所有结点的值均小于或等于它的根结点的值。

(2)右子树上所有结点的值均大于或等于它的根结点的值。

(3)左、右子树也分别为二叉排序树

举个例子:数字6在这棵二叉查找树中,我是怎么找到它的呢?首先从根节点8开始找,6比8小向左节点找找到3,然后6比3大向右节点找就找到6了。

(二分查找的思想:找到数组的中间位置的元素v,将数组分成>v和<v两部分,然后将v和要查找的数据进行一个比较,如果大于v那么就在>v的部分再次进行二分查找,否则就在<v的部分进行二分查找,直到找到对应的元素。)

那既然要查出结果所需的最大次数就是二叉树的高度,那这个高度会不会有时候很长呢?

比如我们依次插入 根节点为9如下五个节点:7,6,5,4,3。依照二叉查找树的特性,结果会变成什么样呢?7,6,5,4,3一个比一个小,那么就会成一条直线,也就是成为了线性的查询,时间复杂度变成了O(N)级别。为了解决这种情况,该红黑树出场了

1.2红黑树

本质上红黑树就是种自平衡的二叉查找树。自平衡的特性就是对HashMap中链表可能会很长做出的优化。

红黑树

红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

性质1. 节点是红色或黑色。

性质2. 根节点是黑色。

性质3 每个叶节点(NIL节点,空节点)是黑色的。

性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

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

2.红黑树的插入

红黑树那么多规则,那么在插入和删除元素会不会破坏红黑树的规则呢?什么情况下会破坏?什么情况下不会?

比如我们向原红黑树插入为14的新节点就不会破坏规则

向原红黑树插入值为21的新节点就破坏了规则

红黑树通过“变色”和“旋转”来维护红黑树的规则,变色就是让黑的变成红的,红的变成黑的,旋转又分为“左旋转”和“右旋转”。这个比较复杂,容易晕,我们就只要知道红黑树就是通过这种方式来实现它的自平衡性就行了。

第一:插入的节点是红色
第二:平衡、或者 旋转算法是对三层树形结构进行的。如果你站在整个树结构上看,你会发现无从下手
第三:什么时候该旋转,不满足h <= log2(n+1),即前两层树形结构不是满二叉树
第四:在插入节点之前,树的结构是符合红黑树的(这个前提很重要

3.红黑树的应用

那为什么要有红黑树呢?

一棵含有n个节点的红黑树的高度至多为2log(n+1).。所以在包含N个节点红黑树中查找一个数据最多只要查找2log(n+1)次时间复杂度O(lgn),而包含N个节点和普通二叉树,链表和数组时间复杂度为O(n)。因此红黑树虽然插入麻烦但是查找的效率非常高,Java集合中的TreeSetTreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值