private void RestoreAfterDelete(OrderedTreeNode x)
{
// maintain Red-Black tree balance after deleting node
OrderedTreeNode y;
while(x != rbTree && x.Color == OrderedTreeNode.BLACK) {
if(x == x.Parent.Left) { // determine sub tree from parent
y = x.Parent.Right; // y is x's sibling
if(y.Color == OrderedTreeNode.RED) {
// x is black, y is red - make both black and rotate
y.Color = OrderedTreeNode.BLACK;
x.Parent.Color = OrderedTreeNode.RED;
RotateLeft(x.Parent);
y = x.Parent.Right;
}
if(y.Left.Color == OrderedTreeNode.BLACK &&
y.Right.Color == OrderedTreeNode.BLACK) {
// children are both black
y.Color = OrderedTreeNode.RED; // change parent to red
x = x.Parent; // move up the tree
}
else {
if(y.Right.Color == OrderedTreeNode.BLACK) {
y.Left.Color = OrderedTreeNode.BLACK;
y.Color = OrderedTreeNode.RED;
RotateRight(y);
y = x.Parent.Right;
}
y.Color = x.Parent.Color;
x.Parent.Color = OrderedTreeNode.BLACK;
y.Right.Color = OrderedTreeNode.BLACK;
RotateLeft(x.Parent);
x = rbTree;
}
}
else {
// right subtree - same as code above with right and left swapped
y = x.Parent.Left;
if(y.Color == OrderedTreeNode.RED) {
y.Color = OrderedTreeNode.BLACK;
x.Parent.Color = OrderedTreeNode.RED;
RotateRight (x.Parent);
y = x.Parent.Left;
}
if(y.Right.Color == OrderedTreeNode.BLACK &&
y.Left.Color == OrderedTreeNode.BLACK) {
y.Color = OrderedTreeNode.RED;
x = x.Parent;
}
else {
if(y.Left.Color == OrderedTreeNode.BLACK) {
y.Right.Color = OrderedTreeNode.BLACK;
y.Color = OrderedTreeNode.RED;
RotateLeft(y);
y = x.Parent.Left;
}
y.Color = x.Parent.Color;
x.Parent.Color = OrderedTreeNode.BLACK;
y.Left.Color = OrderedTreeNode.BLACK;
RotateRight(x.Parent);
x = rbTree;
}
}
}
x.Color = OrderedTreeNode.BLACK;
}