public void put(K key,V value){
TreeNode<K, V> node = new TreeNode<>(key, value);
setRed(node);
//红黑树插入
TreeNode t = this.root,p=null;
if (t==null){
root = node;
setBlack(root);
return;
}else {//寻找插入位置
while(t!=null){
p=t;
if (node.compareTo(t)==0){//覆盖退出
t.setValue(node.getValue());
return;
}else if (node.compareTo(t)>0){
t = t.right;
}else {
t = t.left;
}
}
}
if (node.compareTo(p)>0){
p.right = node;
node.parent = p;
}else {
p.left = node;
node.parent = p;
}
//调整
TreeNode parent=null,pParent=null,uncle = null;
while ((parent = node.parent)!=null &&isRed(parent)){//父亲是红色,那必然有爷爷
pParent = parent.parent;
uncle = getUncle(node);
if (isRed(uncle)){
setRed(pParent);
setBlack(parent);
setBlack(uncle);
node = pParent;
}else if (isBlack(uncle)){
if (parent.isLeft()){
if (!node.isLeft()){
node = parent;
leftRotate(node);
}
setRed(pParent);
setBlack(parent);
rightRotate(pParent);
return;
}else {
if (node.isLeft()){
node = parent;
rightRotate(node);
}
setRed(pParent);
setBlack(parent);
leftRotate(pParent);
return;
}
}
}
if (parent==null){
setBlack(node);
}
}
开启多线程,前提是不考虑线程安全的问题