在二叉查找树上,我们插入节点的过程是这样的:小于节点值往右继续与左子节点比,大于则继续与右子节点比,直到某节点左或右子节点为空,把值插入进去。这样无法避免偏向问题
而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-节点来改进成全都是二叉树呢?
红黑树就字面上的意思,有红色的节点,有黑色的节点:
我们可以将红色节点的左链接画平看看:
一颗典型的二叉树:
将红色节点的左链接画平之后:得到2-3平衡树:
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常用子类的源码,文章敬请期待~~~~
文章的目录导航:https://zhongfucheng.bitcron.com/post/shou-ji/gong-zhong-hao-wen-zhang-zheng-li