简析红黑树
其他
2021-03-23 08:30:15
阅读次数: 0
红黑树节点
红黑树插入删除相关
-
public class RbTree {
RbTreeNode root;
public RbTree(RbTreeNode root){
this.root = root;
}
public RbTreeNode searchRecursively(RbTreeNode root, int v){
if (root == null){
return null;
}
if (v>root.value){
return searchRecursively(root.right, v);
} else if (v<root.value){
return searchRecursively(root.left,v);
} else {
return root;
}
}
public boolean insertRecursively(RbTreeNode root, RbTreeNode newNode){
if (root == null){
root = newNode;
return true;
}
if (newNode.value>root.value){
if (root.right==null){
root.right = newNode;
newNode.parent = root;
newNode.color = false;
insertFixUp(newNode);
return true;
} else {
return insertRecursively(root.right,newNode);
}
}
else if (newNode.value<root.value){
if (root.left == null){
root.left = newNode;
newNode.parent = root;
newNode.color = false;
insertFixUp(newNode);
return true;
} else {
return insertRecursively(root.left,newNode);
}
}
else {
return false;
}
}
public void deleteRecursively(RbTreeNode root, int v){
if (root == null){
return;
}
if (root.value>v){
deleteRecursively(root.left,v);
} else if (root.value<v){
deleteRecursively(root.right,v);
} else {
if (root.right == null && root.left == null){
RbTreeNode parent = root.parent;
if (parent.left == root){
parent.left = null;
return;
}
if (parent.right == root){
parent.right = null;
return;
}
root.parent = null;
return;
} else if (root.right == null){
RbTreeNode left = root.left;
int val = left.value;
root.left = left.left;
root.right = left.right;
root.value = val;
if (left.left!=null){
left.left.parent = root;
}
if (left.right!=null){
left.right.parent = root;
}
} else if (root.left == null){
RbTreeNode right = root.right;
int val = right.value;
root.left = right.left;
root.right = right.right;
root.value = val;
if (right.left!=null){
right.left.parent = root;
}
if (right.right!=null){
right.right.parent = root;
}
} else {
RbTreeNode node = root.left;
while(node.right!=null){
node = node.right;
}
root.value = node.value;
deleteRecursively(node,node.value);
}
}
}
private RbTreeNode parentOf(RbTreeNode node){
return node!=null?node.parent:null;
}
private boolean colorOf(RbTreeNode node){
return node!=null?node.color:true;
}
private boolean isRed(RbTreeNode node){
return (node!=null && node.color==false)?true:false;
}
private boolean isBlack(RbTreeNode node){
return (node!=null && node.color==true)?true:false;
}
private void setRed(RbTreeNode node){
if (node !=null){
node.color = false;
}
}
private void setBlack(RbTreeNode node){
if (node !=null){
node.color = true;
}
}
private void setParent(RbTreeNode node, RbTreeNode parent){
if (node!=null){
node.parent = parent;
}
}
private void setColor(RbTreeNode node, boolean color){
if (node!=null){
node.color = color;
}
}
private void leftRotate(RbTreeNode pNode){
RbTreeNode right = pNode.right;
RbTreeNode rightLeft = right.left;
pNode.right = rightLeft;
if (rightLeft != null){
rightLeft.parent = pNode;
}
right.parent = pNode.parent;
if (pNode.parent == null){
this.root = right;
} else {
if (pNode.parent.left == pNode){
pNode.parent.left = right;
} else {
pNode.parent.right = right;
}
}
right.left = pNode;
pNode.parent = right;
}
private void rightRotate(RbTreeNode pNode){
RbTreeNode left = pNode.left;
RbTreeNode leftRight = left.right;
pNode.left = leftRight;
if (leftRight != null){
leftRight.parent = pNode;
}
left.parent = pNode.parent;
if (pNode.parent == null){
this.root = left;
} else {
if (pNode.parent.left == pNode){
pNode.parent.left = left;
} else {
pNode.parent.right = left;
}
}
left.right = pNode;
pNode.parent = left;
}
private void insertFixUp(RbTreeNode node){
if (node == root){
setBlack(root);
return;
}
if ((parentOf(node)!=null) && (isBlack(parentOf(node)))) {
return;
}
RbTreeNode parent;
RbTreeNode gparent;
while((parent = (parentOf(node))) != null && isRed(parent)) {
gparent = parentOf(parent);
if(gparent == null){
setBlack(parent);
break;
}
if (parent == gparent.left){
RbTreeNode uncle = gparent.right;
if (uncle != null && isRed(uncle)) {
setBlack(uncle);
setBlack(parent);
setRed(gparent);
node = gparent;
continue;
}
if (uncle != null && isBlack(uncle) && parent.right == node){
leftRotate(parent);
node = parent;
continue;
}
if (uncle != null && isBlack(uncle) && parent.left == node){
setBlack(parent);
setRed(gparent);
rightRotate(gparent);
continue;
}
}
else {
RbTreeNode uncle = gparent.left;
if (uncle != null && isRed(uncle)) {
setBlack(uncle);
setBlack(parent);
setRed(gparent);
node = gparent;
continue;
}
if (uncle != null && isBlack(uncle) && parent.left == node){
rightRotate(parent);
node = parent;
continue;
}
if (uncle != null && isBlack(uncle) && parent.right == node){
setBlack(parent);
setRed(gparent);
leftRotate(gparent);
continue;
}
}
}
}
public void remove0(int key){
RbTreeNode node;
if ((node = (searchRecursively(this.root,key))) != null){
remove(node);
}
}
public void remove(RbTreeNode node){
if (node.right != null && node.left != null){
removeNodeWithDoubleChild(node);
}
else if (node.right != null){
removeNodeWithRightChild(node);
}
else if (node.left != null){
removeNodeWithLeftChild(node);
}
else {
removeNodeWithNoChild(node);
}
}
private void removeNodeWithDoubleChild(RbTreeNode node){
RbTreeNode replace = node.right;
while(replace.left != null){
replace = replace.left;
}
node.value = replace.value;
remove(replace);
return;
}
private void removeNodeWithRightChild(RbTreeNode node){
RbTreeNode right = node.right;
RbTreeNode parent = node.parent;
if (parent != null) {
if (parent.left == node){
parent.left = right;
} else {
parent.right = right;
}
} else {
if (parent.left == node){
parent.left = right;
right.parent = parent;
} else {
parent.right = right;
right.parent = parent;
}
}
if (node.color == false) {
removeFixUp(right, parent);
}
}
private void removeNodeWithLeftChild(RbTreeNode node){
RbTreeNode left = node.left;
RbTreeNode parent = node.parent;
if (parent != null) {
if (parent.left == node){
parent.left = left;
} else {
parent.right = left;
}
} else {
if (parent.left == node){
parent.left = left;
left.parent = parent;
} else {
parent.right = left;
left.parent = parent;
}
}
if (node.color == false) {
removeFixUp(left, parent);
}
}
private void removeNodeWithNoChild(RbTreeNode node){
RbTreeNode parent = parentOf(node);
if (parent != null){
if (parent.left == node){
parent.left = null;
} else {
parent.right = null;
}
} else {
this.root = null;
}
}
private void removeFixUp(RbTreeNode child, RbTreeNode parent){
if (child != null && isRed(child)) {
setBlack(child);
return;
}
if (child != null && isBlack(child) && child == this.root){
return;
}
while (child != null && isBlack(child) && child != this.root){
if (parentOf(child) == null){
break;
}
if (parent.left == child) {
RbTreeNode other = parent.right;
if (isRed(other)) {
setBlack(other);
setRed(parent);
leftRotate(parent);
parent = child.parent;
continue;
}
if (other.left == null || isBlack(other.left) && (other.right == null || isBlack(other.right))) {
setRed(other);
child = parent;
parent = parentOf(child);
continue;
}
if ((other.left!=null && isRed(other.left)) && (other.right!=null && isBlack(other.right)) ) {
setBlack(other.left);
setRed(other);
rightRotate(other);
child = other;
parent = parentOf(other);
continue;
}
if (other.right != null && isRed(other.right)) {
setColor(other,colorOf(parentOf(child)));
setBlack(parentOf(child));
setBlack(other.right);
leftRotate(parentOf(child));
child = parentOf(parentOf(child));
parent = parentOf(child);
continue;
}
}
else {
}
}
}
}
转载自blog.csdn.net/Markland_l/article/details/114297983