JAVA中的红黑树

简介: 在开始讨论JAVA中的红黑树之前,就前几篇关于二叉树的文章做个总结。平衡二叉树:高度差绝对值不超过1,任意节点左右子树均为平衡二叉树。AVL树:平衡二叉树只是一个概念,AVL树,红黑树都是这个概念的落地实现。AVL树其实就是《手撕JAVA十三》一文中说的通过RR,RL,LL,LR旋转而成的平衡二叉树。这些旋转都属于AVL树的算法。

在开始讨论JAVA中的红黑树之前,就前几篇关于二叉树的文章做个总结。


平衡二叉树:高度差绝对值不超过1,任意节点左右子树均为平衡二叉树。


AVL树:平衡二叉树只是一个概念,AVL树,红黑树都是这个概念的落地实现。AVL树其实就是《手撕JAVA十三》一文中说的通过RR,RL,LL,LR旋转而成的平衡二叉树。这些旋转都属于AVL树的算法。

 红黑树:由红黑两种颜色组成,根节点必为黑色,无连续红节点,各节点到叶节点路径上黑色节点数量相同。


红黑树与AVL树的优缺点比较:


1.红黑树并非严格平衡,高度差可能会超过1,AVL树严格平衡,高度差绝对值不超过1,所以AVL的查找效率比红黑树高。


2.插入删除操作红黑树的旋转操作次数要远小于AVL,所以插入删除效率红黑树远高于AVL树。


所以简单说,如果搜索的次数远远大于插入和删除,那么选择AVL,如果搜索,插入删除次数几乎差不多,应该选择RB。


JAVA的设计者基于以上各方面考虑最终选择了红黑树作为JAVA中基于平衡二叉树的数据结构中底层的平衡二叉树的实现。

JAVA中基于红黑树实现的容器类,有treeMap,TreeSet。先来看TreeMap的源码

 

TreeMap

首先内部自定义有一个节点类,默认颜色为黑色。

20190730145017114.png

接下来从put方法开始跟踪插入操作

插入操作,首先判断了根节点是否为null,是null,来的节点直接就做根节点。

20190730145506192.png

如果根节点不为null,就会一路比较,先找到节点该插入的位置,插入后调用fixAfterInsertion方法

20190730145635686.png

首先是染红,然后接下来的调整其实就是严格按照之前《手撕JAVA十五》讨论过的算法来进行。

20190730145437750.png

至于删除,跟入此函数会发现也是严格按照《手撕JAVA十六》一文中的算法来实现的。

20190730150141464.png

TreeSet

至于TreeSet底层实现其实就是个TreeMap,只是将KV对中的V通过一个Object类型的常量封起来了,只暴露出来了K给用户操作。

20190730151013248.png

20190730151130704.png

目录
相关文章
|
6月前
|
在Java的集合世界里,Set以其独特的特性脱颖而出,它通过“哈希魔法”和“红黑树防御”两大绝技
【10月更文挑战第13天】在Java的集合世界里,Set以其独特的特性脱颖而出。它通过“哈希魔法”和“红黑树防御”两大绝技,有效抵御重复元素的侵扰,确保集合的纯洁性和有序性。无论是“人海战术”还是“偷梁换柱”,Set都能从容应对,成为开发者手中不可或缺的利器。
57 6
【Java集合类面试十一】、HashMap为什么用红黑树而不用B树?
HashMap选择使用红黑树而非B树,是因为红黑树在内存中实现简单,节点更小,占用内存少,且在插入、删除和查找操作上提供更好的平衡性能。
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
135 0
揭秘!HashMap底层结构大起底:从数组到链表,再到红黑树,Java性能优化的秘密武器!
【8月更文挑战第24天】HashMap是Java集合框架中的核心组件,以其高效的键值对存储和快速访问能力广受开发者欢迎。在JDK 1.8及以后版本中,HashMap采用了数组+链表+红黑树的混合结构,实现了高性能的同时解决了哈希冲突问题。数组作为基石确保了快速定位;链表则用于处理哈希冲突;而当链表长度达到一定阈值时,通过转换为红黑树进一步提升性能。此外,HashMap还具备动态扩容机制,当负载因子超过预设值时自动扩大容量并重新哈希,确保整体性能。通过对HashMap底层结构的深入了解,我们可以更好地利用其优势解决实际开发中的问题。
184 0
深入解析 Java 数据结构:红黑树的特点与应用
红黑树(Red-Black Tree)是一种自平衡的二叉搜索树,它在 Java 编程中扮演着重要的角色,用于高效地存储和管理数据。红黑树的特点使其在查找、插入和删除操作中保持相对平衡,从而提供了稳定且高效的性能。本文将深入探讨红黑树的特点、用法、实现方式以及在实际应用中的优势。
【Java编程进阶之路 02】深入探索:红黑树如何重塑哈希表的性能边界
JDK 1.8之后,HashMap引入红黑树来优化性能,当链表长度超过阈值(默认为8)时,链表会转换为红黑树,从而提高高冲突时的查询效率。同时,HashMap也采用了扰动函数来增加哈希值的随机性,使键值对更均匀分布,提升性能。
102 0
|
11月前
|
Java TreeMap:基于红黑树的排序映射解析
Java TreeMap:基于红黑树的排序映射解析
|
11月前
|
Java TreeSet:基于红黑树的排序集合解析
Java TreeSet:基于红黑树的排序集合解析
133 0
【JavaSE专栏54】Java集合类TreeMap解析,基于红黑树的键值对存储结构
【JavaSE专栏54】Java集合类TreeMap解析,基于红黑树的键值对存储结构
141 0
【JavaSE专栏52】Java集合类TreeSet解析,基于红黑树实现的有序非重集合
【JavaSE专栏52】Java集合类TreeSet解析,基于红黑树实现的有序非重集合
160 0