先看看这篇文章,了解一下红黑树。
http://zh.wikipedia.org/wiki/%E7%BA%A2%E9%BB%91%E6%A0%91
特别注意这一段:
因为每一个红黑树也是一个特化的二叉查找树,因此红黑树上的只读操作与普通二叉查找树上的只读操作相同。然而,在红黑树上进行插入操作和删除操作会导致不再符合红黑树的性质。恢复红黑树的属性需要少量(O(log n))的颜色变更(实际是非常快速的)和不超过三次树旋转(对于插入操作是两次)。虽然插入和删除很复杂,但操作时间仍可以保持为 O(log n) 次。
==================================
看一下帮助文件:
java_zh/java/util/TreeSet.html
public class TreeSet<E>
extends AbstractSet<E>
implements SortedSet<E>, Cloneable, Serializable
此类实现 Set 接口,该接口由 TreeMap 实例支持。此类保证排序后的 set 按照升序排列元素,根据使用的构造方法不同,可能会按照元素的自然顺序 进行排序(参见 Comparable),或按照在创建 set 时所提供的比较器进行排序。
此实现为基本操作(add、remove 和 contains)提供了可保证的 log(n) 时间开销。
==================================
java_zh/java/util/TreeMap.html
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements SortedMap<K,V>, Cloneable, Serializable
SortedMap 接口的基于红黑树的实现。此类保证了映射按照升序顺序排列关键字,根据使用的构造方法不同,可能会按照键的类的自然顺序 进行排序(参见 Comparable),或者按照创建时所提供的比较器进行排序。
此实现为 containsKey、get、put 和 remove 操作提供了保证的 log(n) 时间开销。这些算法是 Cormen、Leiserson 和 Rivest 的《Introduction to Algorithms》中的算法的改编。
==================================
嗯,然后看一段 TreeMap 的源程序。
/** From CLR **/
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) {
setColor(parentOf(x), BLACK);
setColor(y, BLACK);
setColor(parentOf(parentOf(x)), RED);
x = parentOf(parentOf(x));
} else {
if (x == rightOf(parentOf(x))) {
x = parentOf(x);
rotateLeft(x);
}
setColor(parentOf(x), BLACK);
setColor(parentOf(parentOf(x)), RED);
if (parentOf(parentOf(x)) != null)
rotateRight(parentOf(parentOf(x)));
}
} else {
Entry<K,V> y = leftOf(parentOf(parentOf(x)));
if (colorOf(y) == RED) {
setColor(parentOf(x), BLACK);
setColor(y, BLACK);
setColor(parentOf(parentOf(x)), RED);
x = parentOf(parentOf(x));
} else {
if (x == leftOf(parentOf(x))) {
x = parentOf(x);
rotateRight(x);
}
setColor(parentOf(x), BLACK);
setColor(parentOf(parentOf(x)), RED);
if (parentOf(parentOf(x)) != null)
rotateLeft(parentOf(parentOf(x)));
}
}
}
root.color = BLACK;
}
可以看到,在进行红黑属性恢复。
还有其它的一些函数也涉及到红黑属性恢复,可以自行查看。
分享到:
相关推荐
title: TreeSet 和 TreeMap 理论基础Java 根据红黑树这种平衡的二叉搜索树实现了 TreeSet 和 TreeMap 两种数据结构,如果
TreeSet 红黑树结构算法是一种高效的数据结构,它可以快速检索指定节点和自动排序。然而,在使用 TreeSet 时需要注意其缺点,并合理地使用它来提高效率。 知识点总结: * TreeSet 是基于红黑树数据结构的实现 * ...
Java 中 TreeMap 和 TreeSet 实现红黑树 Java 中的 TreeMap 和 TreeSet 都是基于红黑树的数据结构实现的。红黑树是一种自平衡的排序二叉树,它可以保证在插入、删除和搜索操作时都能维持平衡,从而确保搜索、插入...
由于`TreeMap`内部维护了一个红黑树,因此它的键值对是按照键的自然顺序或自定义排序顺序排列的,这使得`TreeMap`非常适合需要保持键有序的场景。 ### TreeSet `TreeSet`是基于`TreeMap`实现的一个Set(集合)实现...
这种特性使得红黑树在大数据量的场景下,如Java集合框架中的TreeMap和TreeSet,具有高效的性能。 红黑树的特性: 1. 每个节点要么是红色,要么是黑色。 2. 根节点是黑色。 3. 所有叶子节点(NIL或空节点)都是黑色...
- Java集合框架:`TreeMap`和`TreeSet`是基于红黑树实现的,提供有序的元素存储和高效的查找、插入和删除操作。 - 数据库索引:数据库系统如MySQL的InnoDB存储引擎使用红黑树作为索引结构。 - C++标准模板库(STL)...
在Java中,虽然没有直接提供红黑树的类,但`java.util.TreeMap`和`java.util.TreeSet`底层就是通过红黑树实现的。它们提供了高效的键值对存储和集合管理,支持有序操作,如按自然顺序或自定义比较器进行排序。 当...
红黑树因其高效性能在许多实际应用中得到采用,如C++标准模板库(STL)中的set和map容器,以及Java的TreeMap和TreeSet类。它们使用红黑树作为底层数据结构,提供快速的查找、插入和删除操作。 5. 红黑树的优势: - ...
在实际应用中,红黑树被广泛应用于各种数据结构,如C++标准模板库(STL)中的map和set,以及Java中的TreeMap和 TreeSet。这些数据结构的底层实现都依赖于红黑树的高效性能。 总结来说,2-3树和红黑树是数据结构中的...
红黑树的应用非常广泛,例如 Epoll 实现、Java 集合中的 TreeSet 和 TreeMap、C++ STL 中的 set、map,以及 Linux 虚拟内存的管理,都是通过红黑树去实现的。 红黑树在 HashMap 中的应用可以提高查找、插入和删除...
- 在Java中,`java.util.TreeMap`和`java.util.TreeSet`的底层数据结构就是红黑树。它们提供了高效的插入、删除和查找操作,时间复杂度为O(log n)。 - `java.util.HashMap`在容量超过默认负载因子(0.75)时,会将...
在Java中,红黑树被广泛应用于集合框架中的`java.util.TreeMap`和`java.util.TreeSet`。 1. **基本概念** - **颜色属性**:每个节点都有红色或黑色两种颜色。 - **性质**:红黑树必须满足以下5个性质: - 节点是...
在Java中,红黑树主要体现在`java.util.TreeMap`和`java.util.TreeSet`这两个类中,它们的底层数据结构就是红黑树。 红黑树有以下特性: 1. 每个节点要么是红色,要么是黑色。 2. 根节点是黑色。 3. 所有叶子节点...
TreeMap 和 TreeSet 是 Java 集合框架中的重要成员,它们提供了基于红黑树的数据结构实现。从给定部分源代码可以看到,TreeSet 的构造器实际上依赖于 TreeMap 的实例化。具体来说: 1. **构造器分析**: - TreeSet...
- Java集合框架中的`TreeMap`和`TreeSet`类使用红黑树作为底层数据结构,提供有序的键值存储和快速查找。 - C++标准模板库(STL)中的`std::map`和`std::set`也使用红黑树实现。 - 数据库系统,如MySQL的InnoDB存储...
红黑树是一种自平衡二叉搜索树,在实际应用中,它广泛用于Linux内核、Java的TreeMap和TreeSet数据结构以及C++的STL中。红黑树的设计旨在保持树的平衡,但是与AVL树不同,它追求的不是绝对的平衡,而是通过放弃一定的...
在Java中,红黑树被广泛应用于集合框架中的`java.util.TreeMap`和`java.util.TreeSet`等类。 1. **红黑树的性质** - 每个节点要么是红色要么是黑色。 - 根节点是黑色。 - 所有叶子节点(NIL或空节点)都是黑色。...
在实际的应用中,红黑树被广泛应用于诸如Java的TreeMap和TreeSet,以及C++ STL中的map、multimap、multiset等数据结构的底层实现。了解红黑树的工作原理对于开发人员而言是十分重要的,它不仅能帮助理解这些数据结构...
structure 跳表 vs 红黑树,对比了两种数据结构的优劣 跳表(Skip List)是一种基于并行...这使得红黑树成为一种广泛应用于高性能数据结构的选择,比如在标准库中的集合类实现中,如 Java 中的 TreeSet 和 TreeMap。
在Java标准库中,`java.util.TreeMap`和`java.util.TreeSet`就是基于红黑树实现的。 红黑树的主要特性是: 1. 每个节点都带有颜色属性,可以是红色或黑色。 2. 根节点是黑色。 3. 所有叶节点(NIL或空节点)都是...