从TreeMap看红黑树算法
来源:互联网 发布:淘宝太阳眼镜 编辑:程序博客网 时间:2024/05/09 04:23
TreeSet基于TreeMap,而TreeMap又是基于红黑树的。
从jdk的TreeMap源码片断可以看出,put(K key, V value) 和 fixAfterInsertion(Entry<K,V> x) 实现了Red-Back Tree(红黑树)的插入功能及插入后的树自平衡功能。
publicV put(K key, V value) {
Entry<K,V> t =root;
if(t == null) {
compare(key,key); // type (and possibly null)check
root = newEntry<>(key, value, null);
size = 1;
modCount++;
return null;
}
intcmp;
Entry<K,V>parent;
// split comparator and comparable paths
Comparator<? superK> cpr = comparator;
if(cpr != null) {
do{
parent = t;
cmp =cpr.compare(key, t.key);
if(cmp < 0)
t = t.left;
else if(cmp > 0)
t = t.right;
else
returnt.setValue(value);
} while(t != null);
}
else{
if(key == null)
throw newNullPointerException();
Comparable<? superK> k = (Comparable<? super K>) key;
do{
parent = t;
cmp =k.compareTo(t.key);
if(cmp < 0)
t = t.left;
else if(cmp > 0)
t = t.right;
else
returnt.setValue(value);
} while(t != null);
}
Entry<K,V> e =new Entry<>(key, value, parent);
if(cmp < 0)
parent.left = e;
else
parent.right = e;
fixAfterInsertion(e);
size++;
modCount++;
return null;
}
private voidfixAfterInsertion(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);
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);
rotateLeft(parentOf(parentOf(x)));
}
}
}
root.color = BLACK;
}
- 从TreeMap看红黑树算法
- 从源码解析TreeMap
- 从源码解析TreeMap
- 从源码解析TreeMap
- 从源码解析TreeMap
- TreeMap 红黑树算法实现
- 从源码理解TreeMap.java
- 算法基础---红黑树(TreeMap)
- TreeMap的实现是红黑算法
- TreeMap
- TreeMap
- treeMap
- TreeMap
- TreeMap
- TreeMap
- TreeMap
- TreeMap
- TreeMap
- 使用C语言进行面向对象的开发--GObject入门[1] [2]
- jquery请求总结:
- 图片预加载
- [同域] iframe子页面调用父页面、父页面调用子页面javascript函数的方法
- select()函数的应用
- 从TreeMap看红黑树算法
- 基于JChardet自动检测文件编码,批量转换文件编码,解决乱码问题
- 诺基亚的“春天”
- linux kernel x86 32/64 memory zones
- 缓冲区方式与IRP的关系
- 探讨盈利性对游戏乐趣的消极影响
- ABAP源程序---发票校验明细表
- Eclipse 多个工程管理(超实用)
- 软件开发问题定位定律