如有错误,还请各位大佬们指出来,谢谢。
var Node = function(val,color){
this.val = val;
this.color = color;
this.original_color = color;
this.left = null;
this.right = null;
this.parent = null;
}
var blackRedTree = function(Node=null){
this.root = Node;
}
blackRedTree.prototype = {
'insertNode':function(Node){
if(this.root == null){
Node.color = 'BLACK';
this.root = Node;
}else{
let sn = this.searchNode(this.root,Node,1); //parentNode
if(sn == false){
return null;
}else if(sn === Node){
return Node;
}else{
if(Node.val < sn.val){
sn.left = Node;
}else{
sn.right = Node;
}
Node.parent = sn;
Node.left = null;
Node.right = null;
Node.color = 'RED';
//FIX_TREE:sn.parent,sn.parent.left,sn.parent.right,sn.parent.parent
INSERT_FIX_TREE(Node);
}
}
},
'deleteNode':function(Node){
if(this.root = null){
return false;
}else{
let sn = this.searchNode(this.root,Node,1);
if(sn == false){
return false;
}else if(sn == Node){
let tmpNode = Node;
let childNode = null;
tmpNode.original_color = tmpNode.color;
if(Node.left == null){
childNode = Node.right;
this.TRANSPLANT(Node,Node.right);
}else if(Node.right == null){
childNode = Node.left;
this.TRANSPLANT(Node,Node.left);
}else{
tmpNode = this.TREE_MINIMUM(Node.right);
tmpNode.original_color = tmpNode.color;
childNode = tmpNode.right;
if(tmpNode.parent == Node){
childNode.parent = tmpNode;
}else{
this.TRANSPLANT(tmpNode,tmpNode.right);
tmpNode.right = Node.right;
tmpNode.right.parent = tmpNode;
}
this.TRANSPLANT(Node,tmpNode);
tmpNode.left = Node.left;
tmpNode.left.parent = tmpNode;
tmpNode.color = Node.color;
}
if(tmpNode.original_color == 'BLACK'){
this.DELETE_FIX_TREE(childNode);
}
}else if(sn != Node){
return false;
}
}
},
'searchNode':function(Rnode,Node=null,use_insert=0){
if(Node == null){
return false;
}
if(Rnode.val < Node.val){
let rRightNode = Rnode.right;
if(use_insert == 1 && rRightNode == null){
return Rnode;
}else if(use_insert == 0 && rRightNode == null){
return false;
}
return this.searchNode(rRightNode,Node);
}else if(Rnode.val == Node.val){
return Node;
}else{
let lLeftNode = Rnode.left;
if(use_insert == 1 && lLeftNode == null){
return Rnode;
}else if(use_insert == 0 && lLeftNode == null){
return false;
}
return this.searchNode(lLeftNode,Node);
}
},
'TREE_MINIMUM':function(treeRootNode){
let trn = treeRootNode;
while(trn.left){
trn = trn.left;
}
return trn;
},
'leftRotate':function(Node){
let nr = Node.right;
if(nr == null){
return false;
}
let np = Node.parent;
let nrl = nr.left;
nr.left = Node;
Node.right = nrl;
if(np.left == Node){
np.left = nr;
}else if(np.right == Node){
np.right = nr;
}else{
return false;
}
return true;
},
'rightRotate':function(Node){
let nl = Node.left;
if(nl == null){
return false;
}
let np = Node.parent;
let nlr = nl.right;
nl.right = Node;
Node.left = nlr;
if(np.right == Node){
np.right = nl;
}else if(np.left == Node){
np.left = nl;
}else{
return false;
}
return true;
},
'INSERT_FIX_TREE':function(Node){
let np = Node.parent;
while(np.color == 'RED'){
let npp = np.parent;
if(npp.left == np){
let nppr = npp.right;
if(nppr.color == 'RED'){
np.color = 'BLACK';
nppr.color = 'BLACK';
npp.color = 'RED';
Node = npp;
}else if(Node == node.parent.right){
Node = Node.parent;
this.rightRotate(Node);
}
Node.parent.color = 'BLACK';
Node.parent.parent.color = 'RED';
this.rightRotate(Node.parent.parent);
}else if(npp.right == np){
let nppl = npp.left;
if(nppl.color == 'RED'){
np.color = 'BLACK';
nppr.color = 'BLACK';
npp.color = 'RED';
Node = npp;
}else if(Node == node.parent.left){
Node = Node.parent;
this.leftRotate(Node);
}
Node.parent.color = 'BLACK';
Node.parent.parent.color = 'RED';
this.leftRotate(Node.parent.parent);
}
}
this.root.color = 'BLACK';
},
'DELETE_FIX_TREE':function(Node){
while(Node != this.root && Node.color == 'BLACK'){
if(Node == Node.parent.left){
let broNode = Node.parent.right;
if(broNode.color == 'RED'){
broNode.color = 'BLACK';
Node.parent.color = 'RED';
this.leftRotate(Node.parent);
broNode = Node.parent.right;
}
if(broNode.color == 'BLACK' && broNode.right.color == 'BLACK'){
broNode.color = 'RED';
Node = Node.parent;
}else if(broNode.right.color == 'BLACK'){
broNode.left.color = 'BLACK';
broNode.color = 'RED';
this.rightRotate(broNode);
broNode = Node.parent.right;
broNode.color = Node.parent.color;
Node.parent.color = 'BLACK';
broNode.right.color = 'BLACK';
this.leftRotate(Node.parent);
Node = this.root;
}
}else if(Node == Node.parent.right){
let broNode = Node.parent.left;
if(broNode.color == 'RED'){
broNode.color = 'BLACK';
Node.parent.color = 'RED';
this.rightRotate(Node.parent);
broNode = Node.parent.left;
}
if(broNode.color == 'BLACK' && broNode.left.color == 'BLACK'){
broNode.color = 'RED';
Node = Node.parent;
}else if(broNode.left.color == 'BLACK'){
broNode.right.color = 'BLACK';
broNode.color = 'RED';
this.leftRotate(broNode);
broNode = Node.parent.left;
broNode.color = Node.parent.color;
Node.parent.color = 'BLACK';
broNode.left.color = 'BLACK';
this.rightRotate(Node.parent);
Node = this.root;
}
}
Node.color = 'BLACK';
}
},
'TRANSPLANT':function(uNode,vNode){
//vNode为uNode的子节点
if(uNode.parent == null){
this.root = vNode;
}else if(uNode == uNode.parent.left){
uNode.parent.left = vNode;
}else{
uNode.parent.right = vNode;
}
vNode.parent = uNode.parent;
}
};