`
jiangxia207
  • 浏览: 2526 次
社区版块
存档分类
最新评论

treemap源码解析之个人小笔记

 
阅读更多
添加entry时,核心函数fixAfterInsertion源码如下:
具体图示请分别参照http://www.cnblogs.com/fornever/archive/2011/12/02/2270692.html 中的插入和删除情形。

private void fixAfterInsertion(Entry<K,V> x) {
        x.color = RED;

        while (x != null && x != root && x.parent.color == RED) {
            if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
                Entry<K,V> y = rightOf(parentOf(parentOf(x)));
                if (colorOf(y) == RED) {
                //parent为red且parent的sibling为red,参照情形3
                    setColor(parentOf(x), BLACK);
                    setColor(y, BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    x = parentOf(parentOf(x));
                } else {
                 //parent为red且parent的sibling为black,参照情形5
                    if (x == rightOf(parentOf(x))) {
                        x = parentOf(x);
                        rotateLeft(x);
                    }
                    //parent为red且parent的sibling为black,参照情形4
                    setColor(parentOf(x), BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    rotateRight(parentOf(parentOf(x)));
                }
            } else {
                Entry<K,V> y = leftOf(parentOf(parentOf(x)));
                if (colorOf(y) == RED) {
                   //parent为red且parent的sibling为red,和情形3对称
                    setColor(parentOf(x), BLACK);
                    setColor(y, BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    x = parentOf(parentOf(x));
                } else {
                    //parent为red且parent的sibling为black,和情形5对称
                    if (x == leftOf(parentOf(x))) {
                        x = parentOf(x);
                        rotateRight(x);
                    }
                    setColor(parentOf(x), BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    rotateLeft(parentOf(parentOf(x)));
                }
            }
        }
        root.color = BLACK;
    }

删除entry时,

private void fixAfterDeletion(Entry<K,V> x) {
        while (x != root && colorOf(x) == BLACK) {
            if (x == leftOf(parentOf(x))) {
                Entry<K,V> sib = rightOf(parentOf(x));

                if (colorOf(sib) == RED) {
                //x为black且x的sibling为red,和情形1对称,x对应n
                    setColor(sib, BLACK);
                    setColor(parentOf(x), RED);
                    rotateLeft(parentOf(x));
                    sib = rightOf(parentOf(x));
                }

                if (colorOf(leftOf(sib))  == BLACK &&
                    colorOf(rightOf(sib)) == BLACK) {
           //sib为之前x的兄弟,当sib的两个子元素均为黑时,在上步条件满足时则和情形3对应;若不满足上面条件,则和情形2对应
                    setColor(sib, RED);
                    x = parentOf(x);
                } else {
                    if (colorOf(rightOf(sib)) == BLACK) {
              //sib的左孩子为红,右孩子为黑,和情形5对应
                        setColor(leftOf(sib), BLACK);
                        setColor(sib, RED);
                        rotateRight(sib);
                        sib = rightOf(parentOf(x));
                    }
             //sib的右孩子为红,和情形4对应;且上面情况必须导致这种情形。
                    setColor(sib, colorOf(parentOf(x)));
                    setColor(parentOf(x), BLACK);
                    setColor(rightOf(sib), BLACK);
                    rotateLeft(parentOf(x));
                    x = root;
                }
            } else { // symmetric
               //下面情形和上面是左右对称的。
                Entry<K,V> sib = leftOf(parentOf(x));

                if (colorOf(sib) == RED) {
                    setColor(sib, BLACK);
                    setColor(parentOf(x), RED);
                    rotateRight(parentOf(x));
                    sib = leftOf(parentOf(x));
                }

                if (colorOf(rightOf(sib)) == BLACK &&
                    colorOf(leftOf(sib)) == BLACK) {
                    setColor(sib, RED);
                    x = parentOf(x);
                } else {
                    if (colorOf(leftOf(sib)) == BLACK) {
                        setColor(rightOf(sib), BLACK);
                        setColor(sib, RED);
                        rotateLeft(sib);
                        sib = leftOf(parentOf(x));
                    }
                    setColor(sib, colorOf(parentOf(x)));
                    setColor(parentOf(x), BLACK);
                    setColor(leftOf(sib), BLACK);
                    rotateRight(parentOf(x));
                    x = root;
                }
            }
        }

        setColor(x, BLACK);
    }
分享到:
评论

相关推荐

    Java TreeMap 源码解析

    继上篇文章介绍完了HashMap,这篇文章开始介绍Map系列另一个比较重要的类TreeMap。 大家也许能感觉到,网络上介绍HashMap的文章比较多,但是介绍TreeMap反而不那么多,这里面是有原因:一方面HashMap的使用场景比较...

    TreeMap源码

    在深入理解TreeMap的源码之前,我们首先要了解其背后的基石——红黑树。 红黑树(Red-Black Tree)是一种自平衡二叉查找树,它具有以下特性: 1. 每个节点要么是红色,要么是黑色。 2. 根节点是黑色。 3. 所有叶子...

    TreeMap源码解读.java

    TreeMap源码解读.java

    JDK源码剖析之红黑树TreeMap.pptx

    JDK源码剖析之红黑树TreeMap,偶然看见,传上来分享一下

    Java源码解析TreeMap简介

    Java源码解析TreeMap简介 TreeMap是Java中的一种常用的排序树,实现了NavigableMap接口。下面是对TreeMap的详细介绍: 1. TreeMap的实现机制 TreeMap是基于Red-Black树的数据结构,红黑树是一种自平衡的二叉查找...

    vue_echarts_treemap.zip

    ECharts 是百度开发的一个基于 JavaScript 的数据可视化库,它提供了丰富的图表类型,包括柱状图、折线图、饼图以及我们关注的 TreeMap。TreeMap 是一种用以表示层次结构数据的可视化方式,通过不同大小的矩形来展示...

    java treemap 学生信息

    在Java编程语言中,`TreeMap` 是一个有序的键值对集合,它实现了 `SortedMap` 接口。这个数据结构内部基于红黑树(Red-Black Tree)算法实现,保证了插入、删除和查找操作的时间复杂度为 O(log n)。在“java treemap...

    通过java.util.TreeMap源码加强红黑树的理解

    通过Java.util.TreeMap源码加强红黑树的理解 红黑树是一种自平衡二叉搜索树,它可以保持树的平衡,避免二叉树的非平衡问题。在Java.util.TreeMap中,红黑树被用来实现Map接口,以提供高效的键值存储和检索操作。...

    C# Treemap Sunburst算法

    **C# TreeMap与Sunburst算法详解** 在信息可视化领域,数据的呈现方式至关重要,它能够帮助我们更好地理解和分析复杂的数据结构。C#编程语言提供了多种工具和库来实现这一目标,其中Treemap和Sunburst是两种非常...

    java用treemap统计单词出现的个数

    Java TreeMap统计单词出现的次数 Java TreeMap是一个有序的Map实现,它可以根据对象的自然顺序或自定义的比较器对键进行排序。在本例中,我们使用TreeMap来统计一个句子或一个段落中单词出现的次数,并按照字母表...

    Treemap-4.1.2

    TreeMap是一种数据结构,它是Java集合框架的一部分,位于`java.util`包中。它实现了一个映射接口,其中键(keys)是唯一的,并且通过自然排序或者自定义比较器进行排序。TreeMap内部使用红黑树算法来维护键值对的...

    DataV-TreeMap示例

    DataV是阿里巴巴开源的一款数据可视化工具,它提供了一系列丰富的图表组件,帮助企业或个人快速构建数据展示应用。在DataV中,TreeMap是一种以矩形树状结构来展示层次数据的可视化方法。这种图表特别适合于显示具有...

    TreeMap按VALUE排序

    TreeMap按VALUE排序

    集合类底层源码解析汇总

    java所有集合类底层源码解析汇总,包括ArrayList、HashMap、HashSet、LinkedList、TreeMap、HashSet、ConcurrentHashMap等集合框架的底层实现源码大白话解读。

    Python TreeMap可视化方案数据源(实现代码,请看我博客专栏《机器学习》)

    本主题聚焦于使用Python的TreeMap进行数据可视化。TreeMap是一种多层嵌套的矩形图,根据数据大小来分配矩形的面积,使得整体布局紧凑且直观。在Python中,我们可以借助Matplotlib库或专门的可视化库如squarify来实现...

    TreeMap的实现

    TreeMap自己的理解

    treemap treeset hashset hashmap 简要介绍

    在Java编程语言中,集合框架提供了多种数据结构来存储和操作数据,其中`TreeMap`、`TreeSet`、`HashSet`以及`HashMap`是最常用的数据结构之一。这些集合类各自有着独特的特性和应用场景,下面将对它们进行详细介绍。...

    Map,HashMap,TreeMap的使用

    Java 中的 Map、HashMap、TreeMap 使用详解 Map 是 Java 集合框架中的一个接口,用于存储键值对,根据键可以获取值。Map 中的键不允许重复,但值可以重复。在 Java 中,HashMap、LinkedHashMap、TreeMap 都实现了 ...

Global site tag (gtag.js) - Google Analytics