一、红黑树的特性

(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. 互联网大厂面试,谈索引就直逼这些底层?难的是我不懂这些原理
  2. 史上最全最常用批处理260多个打包下载
  3. 当S8遇上边缘计算:谈阿里云ENS对直播业务场景的支撑
  4. C4D插件:Springy for Mac 动​​画对象添加重叠动作插件
  5. 内容页响应母版页控件的事件
  6. MYSQL数据库与Emoji表情的故事
  7. iphone-common-codes-ccteam源代码 CCUINavigationBar.h
  8. 用border做三角形
  9. vue项目启动出现cannot GET /服务错误
  10. 联想计算机网络同传速度很慢,利用联想网络同传系统,提升微机室管理效率
  11. python数据结构之匿名函数lambda
  12. 大数据第三季--sqoop(day1)-徐培成-专题视频课程
  13. git中如何获取远程仓库的最新代码?
  14. solaris snoop 抓包
  15. java 中counter什么意思_方便适用的计数器Counter
  16. 安装ps时无法验证订阅状态_如何解决:Office 无法验证此应用程序的许可证
  17. win7 mysql 管理员权限_win7 管理员权限
  18. 私钥记录-支付宝接入
  19. 两个瓶子水怎样一样多_大班科学领域数学活动 | 一样多的水(容积守恒)
  20. Linux系列之CentOS系统安装

热门文章

  1. 成都公积金提取流程(自住住房贷款)
  2. win平板文件服务器,平板远程win10服务器
  3. python前景-Python发展前景如何,有哪些就业方向?
  4. 查找重复文件工具Easy Duplicate Finder
  5. ios-bug.html黑屏重启,iOS 13逼疯果粉:刚买的iPhone黑屏,重启也没用
  6. 要掌握的现货白银技巧
  7. 【新零售】新零售业态下,生鲜农产品产业链重构与赋能
  8. java画乌龟(略丑)
  9. Excel查询某一列的重复数据
  10. 避免死锁 —— 银行家算法