TreeMap 的实现就是红黑树数据结构.docx
《TreeMap 的实现就是红黑树数据结构.docx》由会员分享,可在线阅读,更多相关《TreeMap 的实现就是红黑树数据结构.docx(10页珍藏版)》请在三一办公上搜索。
1、TreeMap的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点。TreeSet 和 TreeMap 的关系为了让大家了解TreeMap和TreeSet之间的关系,下面先看TreeSet类的部分源代码:public class TreeSet extends AbstractSetimplements NavigableSet, Cloneable, java.io.Serializable一/使用NavigableMap的key来保存Set集合的元素 private transient NavigableMap m;/使用一个present作为Ma
2、p集合的所有value。private static final Object present = new Object();/包访问权限的构造器,以指定的NavigableMap对象创建Set集合TreeSet(NavigableMap m) this.m = m;public TreeSet()/以自然排序方式创建一个新的TreeMap,/根据该 TreeSet 创I建一个 TreeSet,/使用该TreeMap的key来保存Set集合的元素this(new TreeMap();public TreeSet(Comparator comparator)/以定制排序方式创建一个新的TreeM
3、ap,/根据该 TreeSet创建一个 TreeSet,/使用该TreeMap的key来保存Set集合的元素this(new TreeMap(comparator);public TreeSet(Collection c)/调用号构造器创建一个TreeSet,底层以TreeMap保存集合元素this();/向 TreeSet中添加Collection集合c里的所有元素 addAll(c);public TreeSet(SortedSet s)/调用号构造器创建一个TreeSet,底层以TreeMap保存集合元素this(parator();/向 TreeSet中添加SortedSet集合s里的
4、所有元素 addAll(s);/TreeSet的其他方法都只是直接调用TreeMap的方法来提供实现.public boolean addAll(Collection c) if (m.size() = 0 & c.size() 0 & c instanceof SortedSet & m instanceof TreeMap)/把c集合强制转换为SortedSet集合 SortedSet set = (SortedSet) c;/把m集合强制转换为TreeMap集合TreeMap map = (TreeMap) m;Comparator cc = (Comparator) parator()
5、;Comparator mc = parator();/如果cc和mc两个Comparator相等 if (cc = mc | (cc != null & cc.equals(mc) 一把/ Collection中所有元素添加成TreeMap集合的key map.addAllForTreeSet(set, present); return true;/直接调用父类的addAll()方法来实现return super.addAll(c);.从上面代码可以看出,TreeSet的号、号构造器的都是新建一个TreeMap作为实际存储Set元素的容器,而另外2个构造器则分别依赖于号和 号构造器,由此可见
6、,TreeSet底层实际使用的存储容器就是TreeMap。与HashSet完全类似的是,TreeSet里绝大部分方法都是直接调用TreeMap的方法来实现的,这一点读者可以自行参阅TreeSet的源代码,此处就不再给 出了。对于TreeMap而言,它采用一种被称为“红黑树”的排序二叉树来保存Map中每个Entry每个Entry都被当成“红黑树”的一个节点对待。例如对于如下程 序而言:public class TreeMapTestpublic static void main(String args)TreeMap map =new TreeMap();map.put(ccc , 89.0);
7、map.put(aaa , 80.0);map.put(zzz , 80.0);map.put(bbb , 89.0);System.out.println(map);当程序执行map.put(ccc , 89.0);时,系统将直接把ccc-89.0这个Entry放入Map中,这个Entry就是该“红黑树的根节点。接着程序执行 map.put(aaa, 80.0);时,程序会将aaa-80.0作为新节点添加到已有的红黑树中。以后每向TreeMap中放入一个key-value对,系统都需要将该Entry当成一个新节点,添加成已有红黑树中,通过这种方式就可保证TreeMap中所有key总 是由小到
8、大地排列。例如我们输出上面程序,将看到如下结果(所有key由小到大地排列):aaa=80.0, bbb=89.0, ccc=89.0, zzz=80.0回页首TreeMap的添加节点红黑树红黑树是一种自平衡排序二叉树,树中每个节点的值,都大于或等于在它的左子树中的所有节点的值,并且小于或等于在它的右子树中的所有节点的值,这确保 红黑树运行时可以快速地在树中查找和定位的所需节点。对于TreeMap而言,由于它底层采用一棵“红黑树”来保存集合中的Entry,这意味这TreeMap添加元素、取出元素的性能都比HashMap低:当TreeMap添 加元素时,需要通过循环找到新增Entry的插入位置,因
9、此比较耗性能;当从TreeMap中取出元素时,需要通过循环才能找到合适的Entry,也比较耗性能。 但TreeMap、TreeSet比HashMap、HashSet的优势在于:TreeMap中的所有Entry总是按key根据指定排序规则保持有序状态,TreeSet中所有元素总 是根据指定排序规则保持有序状态。为了理解TreeMap的底层实现,必须先介绍排序二叉树和红黑树这两种数据结构。其中红黑树又是一种特殊的排序二叉树。排序二叉树是一种特殊结构的二叉树,可以非常方便地对树中所有节点进行排序和检索。排序二叉树要么是一棵空二叉树,要么是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有节点的
10、值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值; 它的左、右子树也分别为排序二叉树。图1显示了一棵排序二叉树:对排序二叉树,若按中序遍历就可以得到由小到大的有序序列。如图1所示二叉树,中序遍历得:2, 3, 4, 8, 9, 9, 10, 13, 15, 18创建排序二叉树的步骤,也就是不断地向排序二叉树添加节点的过程,向排序二叉树添加节点的步骤如下:1. 以根节点当前节点开始搜索。2. 拿新节点的值和当前节点的值比较。3. 如果新节点的值更大,则以当前节点的右子节点作为新的当前节点;如果新节点的值更小,则以当前节点的左子节点作为新的当前节点。4. 重复
11、2、3两个步骤,直到搜索到合适的叶子节点为止。5. 将新节点添加为第4步找到的叶子节点的子节点;如果新节点更大,则添加为右子节点;否则添加为左子节点。掌握上面理论之后,下面我们来分析TreeMap添加节点(TreeMap中使用Entry内部类代表节点)的实现,TreeMap集合的put(K key, V value)方法实现 了将Entry放入排序二叉树中,下面是该方法的源代码:public V put(K key, V value)/先以t保存链表的root节点Entry t = root;/如果t=null,表明是一个空链表,即该TreeMap里没有任何Entryif (t = null)
12、/将新的key-value创建一个Entry,并将该Entry作为rootroot = new Entry(key, value, null);/设置该Map集合的size为1,代表包含一个Entrysize = 1;/记录修改次数为1modCount+;return null;int cmp;Entry parent;Comparator cpr = comparator;/如果比较器cpr不为null,即表明采用定制排序if (cpr != null)do /使用parent上次循环后的t所引用的Entryparent = t;/拿新插入key和t的key进行比较cmp = pare(ke
13、y, t.key);/如果新插入的key小于t的key,t等于t的左边节点if (cmp 0) t = t.right;/如果两个key相等,新的value覆盖原有的value,/并返回原有的value elsereturn t.setValue(value); while (t != null);elseif (key = null)throw new NullPointerException();Comparable k = (Comparable) key; do /使用parent上次循环后的t所引用的Entry parent = t;/拿新插入key和t的key进行比较cmp = p
14、areTo(t.key);/如果新插入的key小于t的key,t等于t的左边节点if (cmp 0) t = t.right;/如果两个key相等,新的value覆盖原有的value,/并返回原有的value elsereturn t.setValue(value); while (t != null);/将新插入的节点作为parent节点的子节点Entry e = new Entry(key, value, parent);/如果新插入key小于parent的key,则e作为parent的左子节点 if (cmp -图4显示了被删除节点既有左子节点,又有右子节点的情形,此时我们采用到是第一种
15、方式进行维护: 图4.被删除节点既有左子树,又有右子树林P&子节直攻为可的子节点.将e,啊右r节点设为pi. f耐中时大任)节点的石于节点J图5显示了被删除节点既有左子树,又有右子树的情形,此时我们采用到是第二种方式进行维护:TreeMap删除节点采用图5所示右边的情形进行维护一一也就是用被删除节点的右子树中最小节点与被删节点交换的方式进行维护。 TreeMap删除节点的方法由如下方法实现:private void deleteEntry(Entry p)modCount+;size-;/如果被删除节点的左子树、右子树都不为空 if (p.left != null & p.right != n
16、ull)/用 p节点的中序后继节点代替p节点 Entry s = successor (p); p.key = s.key;p.value = s.value; p = s;/如果p节点的左节点存在,replacement代表左节点;否则代表右节点。Entry replacement = (p.left != null ? p.left : p.right); if (replacement != null) replacement.parent = p.parent;/如果p没有父节点,则replacemment变成父节点 if (p.parent = null)root = replace
17、ment;/如果p节点是其父节点的左子节点else if (p = p.parent.left) p.parent.left = replacement;/如果p节点是其父节点的右子节点 elsep.parent.right = replacement; p.left = p.right = p.parent = null;/修复红黑树if (p.color = BLACK) fixAfterDeletion(replacement);/如果p节点没有父节点else if (p.parent = null)root = null; else if (p.color = BLACK)/修复红黑树
18、fixAfterDeletion(p); /if (p.parent != null) /如果p是其父节点的左子节点if (p = p.parent.left) p.parent.left = null;/如果p是其父节点的右子节点else if (p = p.parent.right) p.parent.right = null;p.parent = null; 回页首红黑树排序二叉树虽然可以快速检索,但在最坏的情况下:如果插入的节点集本身就是有序的,要么是由小到大排列,要么是由大到小排列,那么最后得到的排序二叉 树将变成链表:所有节点只有左节点(如果插入节点集本身是大到小排列);或所有节点
19、只有右节点(如果插入节点集本身是小到大排列)。在这种情况下,排 序二叉树就变成了普通链表,其检索效率就会很差。为了改变排序二叉树存在的不足,Rudolf Bayer与1972年发明了另一种改进后的排序二叉树:红黑树,他将这种排序二叉树称为对称二叉B树”,而红黑树 这个名字则由Leo J. Guibas和Robert Sedgewick于1978年首次提出。红黑树是一个更高效的检索二叉树,因此常常用来实现关联数组。典型地,JDK提供的集合类TreeMap本身就是一个红黑树的实现。红黑树在原有的排序二叉树增加了如下几个要求:Java实现的红黑树上面的性质3中指定红黑树的每个叶子节点都是空节点,而且
20、并叶子节点都是黑色。但Java实现的红黑树将使用null来代表空节点,因此遍历红黑树时将看 不到黑色的叶子节点,反而看到每个叶子节点都是红色的。 性质1:每个节点要么是红色,要么是黑色。 性质2:根节点永远是黑色的。 性质3:所有的叶节点都是空节点(即null),并且是黑色的。 性质4:每个红色节点的两个子节点都是黑色。(从每个叶子到根的路径上不会有两个连续的红色节点) 性质5:从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点。Java中实现的红黑树可能有如图6所示结构:图6. Java红黑树的示意备注:本文中所有关于红黑树中的示意图采用白色代表红色。黑色节点还是采用了黑色表示。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TreeMap 的实现就是红黑树数据结构 实现 就是 红黑树 数据结构

链接地址:https://www.31ppt.com/p-4925455.html