publicclassTreeMap<K,V>extendsAbstractMap<K,V>implementsNavigableMap<K,V>, Cloneable, java.io.Serializable
/**
* 比较器
*/privatefinal Comparator<?super K> comparator;/*
* 根节点
*/privatetransient Entry<K,V> root;/**
* The number of entries in the tree
*/privatetransientint size =0;/**
* The number of structural modifications to the tree.
*/privatetransientint modCount =0;
/** From CLR */privatevoidfixAfterInsertion(Entry<K,V> x){// 默认为 red
x.color = RED;// x 不为 null , x 不为 root, x 父节点为 red 节点(上溢) --> 需进行恢复while(x != null && x != root && x.parent.color == RED){// x 的父节点 是 x 的祖父节点的 左节点if(parentOf(x)==leftOf(parentOf(parentOf(x)))){// y 是 x 的祖父节点的 右节点, 即 y 是 x 的叔叔节点
Entry<K,V> y =rightOf(parentOf(parentOf(x)));// 叔叔节点是 red 节点 --> 上溢 LL/LR 情况if(colorOf(y)== RED){// 父节点染黑setColor(parentOf(x), BLACK);// 叔叔节点染黑setColor(y, BLACK);// 祖父节点染红setColor(parentOf(parentOf(x)), RED);// 将新修改节点继续迭代, 直至平衡
x =parentOf(parentOf(x));}// 叔叔节点是 black 节点else{// x 是父节点右节点 --> LR 情况if(x ==rightOf(parentOf(x))){// 左旋转父节点, x 节点上升一位, 父节点下移一位
x =parentOf(x);// 经过旋转, 现在新添加的节点相当于原添加节点的父节点rotateLeft(x);}// x 是父节点左节点, LR 情况经左旋转到达 LL 情况// 父节点染黑setColor(parentOf(x), BLACK);// 祖父节点染红setColor(parentOf(parentOf(x)), RED);// 右旋转, 祖父节点成为父节点右节点rotateRight(parentOf(parentOf(x)));}}// x 的父节点 是 x 的祖父节点的 右节点else{
Entry<K,V> y =leftOf(parentOf(parentOf(x)));// 叔叔节点是 red 节点 --> 上溢 RR/RL 情况if(colorOf(y)== RED){setColor(parentOf(x), BLACK);setColor(y, BLACK);setColor(parentOf(parentOf(x)), RED);
x =parentOf(parentOf(x));}// 叔叔节点是 black 节点else{// x 是父节点左节点 --> RL 情况if(x ==leftOf(parentOf(x))){
x =parentOf(x);rotateRight(x);}// x 是父节点右节点, RL 情况经右旋转到达 RR 情况setColor(parentOf(x), BLACK);setColor(parentOf(parentOf(x)), RED);rotateLeft(parentOf(parentOf(x)));}}}//根节点永远是 black
root.color = BLACK;}
staticfinalclassEntry<K,V>implementsMap.Entry<K,V>{
K key;
V value;
Entry<K,V> left;
Entry<K,V> right;
Entry<K,V> parent;boolean color = BLACK;/**
* Make a new cell with given key, value, and parent, and with
* {@code null} child links, and BLACK color.
*/Entry(K key, V value, Entry<K,V> parent){this.key = key;this.value = value;this.parent = parent;}public K getKey(){return key;}public V getValue(){return value;}public V setValue(V value){
V oldValue =this.value;this.value = value;return oldValue;}publicbooleanequals(Object o){if(!(o instanceofMap.Entry))returnfalse;
Map.Entry<?,?> e =(Map.Entry<?,?>)o;returnvalEquals(key,e.getKey())&&valEquals(value,e.getValue());}publicinthashCode(){int keyHash =(key==null ?0: key.hashCode());int valueHash =(value==null ?0: value.hashCode());return keyHash ^ valueHash;}public String toString(){return key +"="+ value;}}
删
/**
* 门面
*/public V remove(Object key){//检测是否存在
Entry<K,V> p =getEntry(key);if(p == null)return null;
V oldValue = p.value;deleteEntry(p);return oldValue;}/**
* Delete node p, and then rebalance the tree.
*
* 度为 0 -- 父节点对应子树设置为 null
* 度为 1 -- 父节点对应子树设置为删除节点子树
* 度为 2 -- 从左右子树中寻找节点替代,并对替代节点进行更新
*/privatevoiddeleteEntry(Entry<K,V> p){
modCount++;
size--;// 有左右子树,返回右子树的最左左叶子节点if(p.left != null && p.right != null){//寻找后继节点进行替代
Entry<K,V> s =successor(p);//修改要删除节点的 key 和 value
p.key = s.key;
p.value = s.value;//对替代原节点的节点进行操作
p = s;}// p has 2 children// 只存在左子树或右子树
Entry<K,V> replacement =(p.left != null ? p.left : p.right);//有左(右)子树,进行中间节点的移除,然后用左右节点进行替代if(replacement != null){// 替代原节点的节点的左(右)子树进行 父节点的更新
replacement.parent = p.parent;// 替代的是根节点(一个元素的时候)if(p.parent == null)
root = replacement;//左elseif(p == p.parent.left)
p.parent.left = replacement;//右else
p.parent.right = replacement;// Null out links so they are OK to use by fixAfterDeletion.
p.left = p.right = p.parent = null;// 删除的节点是 black 节点if(p.color == BLACK)// 恢复红黑树平衡fixAfterDeletion(replacement);}elseif(p.parent == null){// 只有一个节点
root = null;}// 叶子节点,直接更新父节点 左右子树为 nullelse{if(p.color == BLACK)// 恢复红黑树平衡 fixAfterDeletion(p);//p 有父节点if(p.parent != null){//p 为父节点的左子树if(p == p.parent.left)
p.parent.left = null;//p 为父节点的右子树elseif(p == p.parent.right)
p.parent.right = null;//gc 回收
p.parent = null;}}}
恢复红黑树性质
// 删除节点是 black 节点 --> 传入的是删除后替代删除节点的节点 或 删除节点是 black 叶子节点privatevoidfixAfterDeletion(Entry<K,V> x){// 删除红色节点不进入while(x != root &&colorOf(x)== BLACK){// 删除节点是父节点左子节点if(x ==leftOf(parentOf(x))){// 兄弟节点
Entry<K,V> sib =rightOf(parentOf(x));// 兄弟节点是 red 节点 (black 叶子节点时进行修正)--> 将兄弟节点转化为 black 节点if(colorOf(sib)== RED){setColor(sib, BLACK);setColor(parentOf(x), RED);// 左旋转, 右节点上提rotateLeft(parentOf(x));// 更新
sib =rightOf(parentOf(x));}// 兄弟节点经转化为必然 black 节点// 兄弟节点左右子节点是 black, 没有 red 节点借给删除节点// colorOf( null ) = BLACKif(colorOf(leftOf(sib))== BLACK &&colorOf(rightOf(sib))== BLACK){setColor(sib, RED);// 有可能再次迭代, 进行修复
x =parentOf(x);}else{// 兄弟节点有一个 red 节点, 且为 black 右节点, red 左节点 --> 右旋转变为有左节点if(colorOf(rightOf(sib))== BLACK){setColor(leftOf(sib), BLACK);setColor(sib, RED);rotateRight(sib);
sib =rightOf(parentOf(x));}// 必然 : 兄弟节点有一个 red 节点, 且为 black 左节点, red 右节点 --> 统一操作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;}}}// x = parentOf(x) 或 x = rootsetColor(x, BLACK);}