一、红黑树的特性

(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点

二、TreeNode和一些方法

static final class TreeNode<K, V> extends LinkedHashMap.Entry<K, V> {TreeNode<K, V> parent;//父节点TreeNode<K, V> left;//左子节点TreeNode<K, V> right;//右子节点TreeNode<K, V> prev;//前方节点boolean red;//是否是红色TreeNode(int hash, K key, V value, Node<K, V> next) {super(hash, key, value, next);}/** @return 返回当前红黑树的根节点*/final TreeNode<K, V> root() {for (TreeNode<K, V> r = this, p; ; ) {if ((p = r.parent) == null) {return r;}r = p;}}/*** 使给定节点成为当前红黑树的根节点*/static <K, V> void moveRootToFront(Node<K, V>[] tab, TreeNode<K, V> root) {//获得当前数组容量int n = tab.length;if (root != null && tab != null && n > 0) {//root不为空,数组不为空,数组容量大于0//计算root的位置int index = (n - 1) & root.hash;//获得当前位置的TreeNodeTreeNode<K, V> first = (TreeNode<K, V>) tab[index];if (root != first) {//当前TreeNode不是root//将root放到当前位置tab[index] = root;//获得root的前节点和后节点TreeNode<K, V> rp = root.prev;Node<K, V> rn = root.next;if (rn != null) {//如果前节点不为空//前节点的后节点指向root的后节点((TreeNode<K, V>) rn).prev = rp;}if (rp != null) {//如果后节点不为空//后节点的前节点指向root的前节点rp.next = rn;}if (first != null) {//如果当前TreeNode不为空//当前TreeNode的前节点指向rootfirst.prev = root;}//root的后节点指向当前TreeNoderoot.next = first;//root的前节点指向nullroot.prev = null;}//检查红黑树结构是否正确assert checkInvariants(root);}}/*** 检查红黑树的结构是否正确** @return true结构正确,false结果错误*/static <K, V> boolean checkInvariants(TreeNode<K, V> t) {//获得t节点的父节点,左子节点,右子节点,前节点和后节点TreeNode<K, V> tp = t.parent, tl = t.left, tr = t.right,tb = t.prev, tn = (TreeNode<K, V>) t.next;if (tb != null && tb.next != t) {//如果前节点不为空,且前节点的后节点不为t,返回falsereturn false;}if (tn != null && tn.prev != t) {//如果后节点不为空,且后节点的前节点不为t,返回falsereturn false;}if (tp != null && t != tp.left && t != tp.right) {//如果父节点不为空,且t节点不为父节点的左右子节点,返回falsereturn false;}if (tl != null && (tl.parent != t || tl.hash > t.hash)) {//如果左子节点不为空,且左子节点的父节点不为t或者左子节点的hash值大于t节点的hash值,返回falsereturn false;}if (tr != null && (tr.parent != t || tr.hash < t.hash)) {//如果右子节点不为空,且右子节点的父节点不为t或者右子节点的hash值小于t节点的hash值,返回falsereturn false;}if (t.red && tl != null && tl.red && tr != null && tr.red) {//如果t节点和他的左右子节点都为红色,返回falsereturn false;}if (tl != null && checkInvariants(tl)) {//递归检查左子节点return false;}if (tr != null && checkInvariants(tr)) {//递归检查右子节点return false;}//通过上述检查返回truereturn true;}}

Java 8 HashMap(五)——TreeNode的介绍相关推荐

  1. java:Map借口及其子类HashMap五,identityHashMap子类

    java:Map借口及其子类HashMap五,identityHashMap子类 了解:identityHashMap子类 一般情况下,标准的Map,是不会有重复的key值得value的,相同的key ...

  2. Java基础 HashMap实现原理及方法

    1.什么是HashMap? HashMap通常提起他,我们想到的就是键值对方式存储(key-value型式),可以接收null键值和null值.基于Map接口的非同步实现(也就是线程不安全),并不保证 ...

  3. Redis五种数据类型介绍

    概述 Redis的键值可以使用物种数据类型:字符串,散列表,列表,集合,有序集合.本文详细介绍这五种数据类型的使用方法.本文命令介绍部分只是列举了基本的命令,至于具体的使用示例,可以参考Redis官方 ...

  4. Java中HashMap和TreeMap的区别深入理解,java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  5. Java中HashMap底层实现原理

    Java面试绕不开的问题: Java中HashMap底层实现原理(JDK1.8)源码分析 这几天学习了HashMap的底层实现,但是发现好几个版本的,代码不一,而且看了Android包的HashMap ...

  6. Java之HashMap系列--HashMap扩容的原理

    原文网址:Java之HashMap系列--HashMap扩容的原理_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java的HashMap是如何扩容的. 重要大小 类 初始容量 最大容量 扩容 ...

  7. 【转】edis五种数据类型介绍

    概述: Redis的键值可以使用物种数据类型:字符串,散列表,列表,集合,有序集合.本文详细介绍这五种数据类型的使用方法.本文命令介绍部分只是列举了基本的命令,至于具体的使用示例,可以参考Redis官 ...

  8. Java笔记整理五(Iterator接口,泛型,常见数据结构(栈,队列,数组,链表,红黑树,集合),jdk新特性,异常,多线程,Lambda表达式)

    Java笔记整理五 1.1Iterator接口 Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象 ...

  9. 判断三角形java代码_小猿圈Java循环嵌套语法的使用介绍

    Java是一直被程序员使用的程序之一,而且应用也是最广泛的一个,很多应用中都会用得到,小猿圈java讲师就为你介绍一下Java循环嵌套语法的使用介绍,希望对你有所帮助. 嵌套循环是指在一个循环语句的循 ...

  10. java hashmap 无序,【Java】HashMap自定义排序

    HashMap中的对象根据成员进行自定义排序 Map是Java中最常用的存储对象的集合类之一,存储在HashMap中的对象在取出时是无序的,下文以示例介绍了如果对HashMap中存储的对象根据成员进行 ...

最新文章

  1. Soa和Wcf(转)
  2. 【机器视觉】 break算子
  3. 牛客网 对称平方数【回文数的判断 两个vector是否相等】
  4. c#报错不实现接口成员_《C#程序设计》 习 题 集
  5. Python 多线程中死锁了怎么办?
  6. Hibernate学习基本配置
  7. 如何使用git把本地代码上传(更新)到github上
  8. CSS从入门到精通——基础知识
  9. python爬取豆瓣电影名称与评分进行分析
  10. 最大似然估计和最小二乘法 含代码
  11. 常用计算机检索算符,计算机信息检索过程中常用的检索表达式
  12. tftpd32.exe的安装
  13. 安卓利用谷歌文字转语音引擎实现离线文字播报语音
  14. django 框架模型之models常用的Field,这些Field的参数、及常见错误原因及处理方案。
  15. 烧录flash_烧录固件完成后,配置JFLASH让程序自动运行
  16. 【yoyo】点击切换图片
  17. 理解区块链背后的Merkle Tree
  18. 智慧水务平台建设方案
  19. 一个列子让你弄懂SpringBoot实现后台框架的搭建
  20. Win11pin密码灰色无法删除怎么解决?

热门文章

  1. MySQL查看数据库信息
  2. 生活杂记(复机以及补卡)
  3. python练习题-基础巩固-第一周
  4. 从入门到实践:Uni-app跨平台开发与应用
  5. 解决上传iphone拍照的图片自动翻转的问题
  6. 17岁女生自曝做鸡心酸经历
  7. python保存表情包_用 Python 把朋友头像变表情包? Easy!
  8. 数据库(简单的添加删除)
  9. 苹果三星加速手机创新 国内厂商敲警钟
  10. 搞定第二、三、四层交换机,这是我见过最好的分析