一. 红黑树在java8中主要运用于hashmap的hash冲突,treemap的实现上
二. 红黑树的由来:
2-3树:
2-3树是二叉查找树的变种,树中的2和3代表两种节点,以下表示为2-节点和3-节点。
2-节点即普通节点:包含一个元素,两条子链接。
3-节点则是扩充版,包含2个元素和三条链接:两个元素A、B,左边的链接指向小于A的节点,中间的链接指向介于A、B值之间的节点,右边的链接指向大于B的节点。
(1).3-节点没有父节点,即整棵树就只有它一个三节点。此时,将3-节点扩充为一个4-节点,即包含三个元素的节点,然后将其分解,变成一棵二叉树。
此时二叉树依然保持平衡。
(2).3-节点有一个2-节点的父节点,此时的操作是,3-节点扩充为4-节点,然后分解4-节点,然后将分解后的新树的父节点融入到2-节点的父节点中
(3).3-节点有一个3-节点的父节点,此时操作是:3-节点扩充为4-节点,然后分解4-节点,新树父节点向上融合,上面的3-节点继续扩充,融合,分解,新树继续向上融合,直到父节点为2-节点为止,如果向上到根节点都是3-节点,将根节点扩充为4-节点,然后分解为新树,至此,整个树增加一层,仍然保持平衡。
红黑树本质上就是一颗二叉平衡树,因为普通二叉树,在最坏的情况下会演变成一个线性查找,时间复杂度为O(n),但是平衡二叉树会保证树的平衡,数据稳定在o(logn)以内查询完成,平衡树有个缺点就是插入和删除会破坏掉这个树的平衡,由于这种特性,就由2-3树去实现他的平衡,但是2-3树的实现又不方便实现,就通过红黑树来实现。红黑树和2-3树的关联,首先,最台面上的问题,红和黑的含义。红黑树中,所有的节点都是标准的2-节点,为了体现出3-节点,这里将3-节点的两个元素用左斜红色的链接连接起来,即连接了两个2-节点来表示一个3-节点。这里红色节点标记就代表指向其的链接是红链接,黑色标记的节点就是普通的节点。所以才会有那样一条定义,叫“从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点”,因为红色节点是可以与其父节点合并为一个3-节点的,红黑树实现的其实是一个完美的黑色平衡,如果你将红黑树中所有的红色链接放平,那么它所有的叶子节点到根节点的距离都是相同的。所以它并不是一个严格的平衡二叉树,但是它的综合性能已经很优秀了。
红黑树的几个特点:
1.节点一定是黑色 or 红色;
2.根节点一定是黑色;
3.叶子节点一定是黑色;
4.红色节点的子节点一定是两个黑色节点;
5.任一节点出发,到叶子节点的黑色节点个数都是相等的。
三.红黑树的操作:
1.旋转
2.变色
参考资料:
红黑树的实现原理:https://www.cnblogs.com/hilow/p/3949188.html
模拟红黑树插入删除过程:https://www.cs.usfca.edu/~galles/visualization/RedBlack.html