Java Collections Framework - 红黑树

红黑树在Java中的应用

在Java集合类中,TreeMap和TreeSet的底层就是基于红黑树实现的,在JDK 1.8中如果HashMap和ConcurrentHashMap的某Bucket的链表的数量大于8,就会自动转换成红黑树结构,所以红黑树是一种应用很广的二叉查找树。

红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。

它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。


二叉查找树

二叉查找树(Binary Sort Tree)具备什么特性呢?

1.左子树上所有结点的值均小于或等于它的根结点的值。
2.右子树上所有结点的值均大于或等于它的根结点的值。
3.左、右子树也分别为二叉排序树。

下图就是个典型的二叉查找树
Java Collections Framework - 红黑树_第1张图片

二分查找正是用的这个思想,查找所需要的最大次数等于树的高度。

但是二叉查找树也存在缺陷,可能变成以下的情况
Java Collections Framework - 红黑树_第2张图片

这样整个二叉查找树就几乎变成线性的了。


红黑树

因为二叉查找树可能出现上面的情况,所以红黑树应运而生。红黑树是一种自平衡的二叉查找树。
具有一下特性:

1、每个节点要么红色,要么是黑色;
2、根节点一定是黑色的;
3、每个空叶子节点必须是黑色的;
4、从每个叶子到根的所有路径上不能有两个连续的红色节点
5、任何一个节点向下遍历到其子孙的叶子节点,所经过的黑节点个数必须相等

Java Collections Framework - 红黑树_第3张图片

只要满足以上5个特性的二叉树都是红黑树,当有新的节点加入时,有可能会破坏其中一些特性,需要通过左旋或右旋操作调整树结构,重新着色,使之重新满足所有特性。


AVL 树

AVL是一种高度平衡的二叉树,AVL树中任何节点的两个子树的高度最大差别为一.
Java Collections Framework - 红黑树_第4张图片
AVL过度的要求树的平衡,在一些场景中性能不如红黑树。

你可能感兴趣的:(Java,Collections,Framework,Data,Structure)