treemap底层结构_红黑树这个数据结构,让你又爱又恨?看了这篇,妥妥的征服它...

红黑树是一个比较复杂的数据结构,相信很多人也只知其名而不知其意,因为理解它的原理确实需要花费一定的功夫。之所以写这篇文章,也是为了更好的理解 Java 中 TreeMap 的源码。写之前,搜了下网上的文章,说实话,看完有点懵,大部分一上来就给你它的五大性质,然后就是一顿插入、删除、旋转操作,就完事了,理解起来相当吃力。本文将结合 2-3-4 树,循序渐进地介绍红黑树的由来和原理,相信看完之后,你对...
摘要由CSDN通过智能技术生成

红黑树是一个比较复杂的数据结构,相信很多人也只知其名而不知其意,因为理解它的原理确实需要花费一定的功夫。之所以写这篇文章,也是为了更好的理解 Java 中 TreeMap 的源码。

写之前,搜了下网上的文章,说实话,看完有点懵,大部分一上来就给你它的五大性质,然后就是一顿插入、删除、旋转操作,就完事了,理解起来相当吃力。

本文将结合 2-3-4 树,循序渐进地介绍红黑树的由来原理,相信看完之后,你对它会有更清晰的认识。此外,这里描述的是普通红黑树,而不是它的变体左倾红黑树(LLRB),这一点需要注意。

红黑树的引入

二叉查找树

红黑树的由来要从二叉查找树说起。二叉查找树是一颗二叉树,它每个结点的值都大于其左子树的任意结点而小于右子树的任意结点,它结合了链表插入的灵活性有序数组查找的高效性(二分查找)

4f27ac131deff266a779a03bb9c7688d.png

对于使用二叉查找树的算法,它的运行时间取决于树的形状,而树的形状又取决于结点插入的先后顺序。如上图所示,最好情况下N 个结点的树是完全平衡的,每条空链接到根结点的距离都为 ~lgN;而在最坏的情况下,搜索路径上可能有 N 个结点,退化成了链表

所以,为了保证运行时间始终在对数级别,在动态构建二叉查找树时,希望保持其平衡性,也就是降低树的高度,使其尽可能为 ~lgN,这样就能保证所有的查找都能在 ~lgN 次比较内结束,就像二分查找那样,这样的树被称为平衡二叉查找树

AVL 树

第一个自平衡二叉查找树就是AVL 树,它规定,每个结点的左右子树的高度之差不超过 1。在插入或删除结点,打破平衡后,就会通过一次或多次树旋转来重新平衡。

AVL 树是严格平衡的,适用于查找密集型应用程序,因为在频繁插入或删除结点的场景下,它花费在树旋转的代价太高。

红黑树就是一种折中方案,它不追求完美平衡,只求部分达到平衡,从而降低在调整时树旋转次数。

2-3-4 树

说到红黑树,就不得不提 2-3-4 树,因为,红黑树可以说就是它的一种特殊实现,对它有所了解,非常有助于理解红黑树。

保持平衡,无非是为了降低树的高度,如果把二叉查找树一般化,允许一个结点保存多个值,变成多叉树,也可认为是降低了高度。

确切地说,标准二叉查找树中的结点称为2-结点(一个值两个子结点),现在引入3-结点(两个值三个子结点)和4-结点(三个值四个子结点),这样就能得到一颗 2-3-4 树(也称为 2-4 树)。

b2074b119723c5e3d62ae40e70e216d0.png

2-3-4 树是 4 阶 B 树,所有数据按排序顺序保存,所有叶子结点都在相同的深度。对于大多数编程语言,直接实现 2-3-4 树比较困难,而红黑树的实现相对要简单容易,这也是红黑树应用广泛的一部分原因。

80bb3a8d078728f7a0a16f7e6cacefc8.png

红黑树是二叉树,所有的结点都是2-结点,所以为了能够表示3-结点和4-结点,为结点引入了颜色属性

  • 黑色,表示普通结点
  • 红色,表示可与父结点合并看作多值结点

如上图所示,如果把红黑树的红色结点和其父结点放平,它的结构就和左边的 2-3-4 树一样。

红黑树

现在,来看下红黑树的性质:

  1. 每个结点都是红色或黑色的
  2. 根结点是黑色的(是红色最终也会转黑色)
  3. 所有叶子结点都是黑色的,这里的叶子结点指的是空结点,常用 NIL 表示
  4. 如果结点为红色,则其子结点均为黑色(红色表示可与父结点合并,子结点凑什么热
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值