Map集合、散列表、红黑树介绍 (2)

在二叉查找树上,我们插入节点的过程是这样的:小于节点值往右继续与左子节点比,大于则继续与右子节点比,直到某节点左或右子节点为空,把值插入进去。这样无法避免偏向问题

而2-3树不一样:它插入的时候可以保持树的平衡

在2-3树插入的时可以简单总结为两个操作:

合并2-节点为3-节点,扩充将3-节点扩充为一个4-节点

分解4-节点为3-节点,节点3-节点为2-节点

........至使得树平衡~

合并分解的操作还是比较复杂的,要分好几种情况,代码量很大~这里我就不介绍了,因为要学起来是一大堆的,很麻烦~

3.3从2-3树到红黑树

由于2-3树为了保持平衡性,在维护的时候是需要大量的节点交换的!这些变换在实际代码中是很复杂的,大佬们在2-3树的理论基础上发明了红黑树(2-3-4树也是同样的道理,只是2-3树是最简单的一种情况,所以我就不说2-3-4树了)。

红黑树是对2-3查找树的改进,它能用一种统一的方式完成所有变换

红黑树是一种平衡二叉树,因此它没有3-节点。那红黑树是怎么将3-节点来改进成全都是二叉树呢?

红黑树就字面上的意思,有红色的节点,有黑色的节点

Map集合、散列表、红黑树介绍

我们可以将红色节点的左链接画平看看:

Map集合、散列表、红黑树介绍

一颗典型的二叉树:

Map集合、散列表、红黑树介绍

将红色节点的左链接画平之后:得到2-3平衡树:

Map集合、散列表、红黑树介绍

3.4红黑树基础知识

前面已经说了,红黑树是在2-3的基础上实现的一种树,它能够用统一的方式完成所有变换。很好理解:红黑树也是平衡树的一种,在插入元素的时候它也得保持树的平衡,那红黑树是以什么的方式来保持树的平衡的呢?

红黑树用的是也是两种方式来替代2-3树不断的节点交换操作:

旋转:顺时针旋转和逆时针旋转

反色:交换红黑的颜色

这个两个实现比2-3树交换的节点(合并,分解)要方便一些

红黑树为了保持平衡,还有制定一些约束,遵守这些约束的才能叫做红黑树:

红黑树是二叉搜索树。

根节点是黑色

每个叶子节点都是黑色的空节点(NIL节点)

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

从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点(每一条树链上的黑色节点数量(称之为“黑高”)必须相等)

3.5红黑树总结

红黑树可以说是十分复杂的,我在学习的时候并没有去认真细看当中的处理细节,只是大概的过了一遍,知道了整体~

有了前辈很多优质的资料,相信要等到想要理解其中的细节,花点力气和时间还是可以掌握一二的。

红黑树参考资料:

https://blog.csdn.net/chen_zhang_yu/article/details/52415077

https://www.jianshu.com/p/37c845a5add6

https://www.cnblogs.com/nullzx/p/6111175.html

https://blog.csdn.net/fei33423/article/details/79132930

四、总结

这篇主要介绍了Map集合的基础知识,了解Map的常用子类~

简单介绍了散列表和红黑树,他俩作为Hashxxx和Treexxx的底层,了解其整体思想和相关基础在后续看源码也不至于那么懵~

后续会去看Map常用子类的源码,文章敬请期待~~~~

Map集合、散列表、红黑树介绍

文章的目录导航:https://zhongfucheng.bitcron.com/post/shou-ji/gong-zhong-hao-wen-zhang-zheng-li

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzxjw.html