Exemple #1
0
 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));
         }
     }
 }
Exemple #2
0
 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)));
         }
     }
 }
Exemple #3
0
 private RedBlackTree(Color c, T e, RedBlackTree <T> /*?*/ l, RedBlackTree <T> /*?*/ r)
 {
     color = c; value = e; left = l; right = r;
 }