private static RedBlackTree <T> /*!*/ Balance(Color c, T e, RedBlackTree <T> /*?*/ l, RedBlackTree <T> /*?*/ r) { if (c == Color.R) { return(new RedBlackTree <T>(c, e, l, r)); } else { /*c == Color.Black*/ if (l != null && l.color == Color.R && l.left != null && l.left.color == Color.R) { RedBlackTree <T> ll = l.left; RedBlackTree <T> newl = new RedBlackTree <T>(Color.B, ll.value, ll.left, ll.right); RedBlackTree <T> newr = new RedBlackTree <T>(Color.B, e, l.right, r); return(new RedBlackTree <T>(Color.R, l.value, newl, newr)); } else if (l != null && l.color == Color.R && l.right != null && l.right.color == Color.R) { RedBlackTree <T> newl = new RedBlackTree <T>(Color.B, l.value, l.left, l.right.left); RedBlackTree <T> newr = new RedBlackTree <T>(Color.B, e, l.right.right, r); return(new RedBlackTree <T>(Color.R, l.right.value, newl, newr)); } else if (r != null && r.color == Color.R && r.left != null && r.left.color == Color.R) { RedBlackTree <T> newl = new RedBlackTree <T>(Color.B, e, l, r.left.left); RedBlackTree <T> newr = new RedBlackTree <T>(Color.B, r.value, r.left.right, r.right); return(new RedBlackTree <T>(Color.R, r.left.value, newl, newr)); } else if (r != null && r.color == Color.R && r.right != null && r.right.color == Color.R) { RedBlackTree <T> rr = r.right; RedBlackTree <T> newl = new RedBlackTree <T>(Color.B, e, l, r.left); RedBlackTree <T> newr = new RedBlackTree <T>(Color.B, rr.value, rr.left, rr.right); return(new RedBlackTree <T>(Color.R, r.value, newl, newr)); } else { return(new RedBlackTree <T>(c, e, l, r)); } } }
private static RedBlackTree <T> /*?*/ RemoveHelper(RedBlackTree <T> /*?*/ t, T /*?*/ o, out bool deleted) { if ((object)t == null) { deleted = false; return(t); } else { int k = HashAlgorithms.CompareValues(o, t.value); if (k == 0) { deleted = true; if (t.left == null) { return(t.right); } else if (t.right == null) { return(t.left); } else { return(Relink(t.left, t.right)); } } else if (k < 0) { return(Balance(t.color, t.value, RemoveHelper(t.left, o, out deleted), t.right)); } else { return(Balance(t.color, t.value, t.left, RemoveHelper(t.right, o, out deleted))); } } }
private RedBlackTree(Color c, T e, RedBlackTree <T> /*?*/ l, RedBlackTree <T> /*?*/ r) { color = c; value = e; left = l; right = r; }