Beispiel #1
0
        public static void fixup(Node z)
        {
            while (z.getParent ().getColor () == false) { // parent van z is rood

                if (z.getParent ().Equals (z.getParent ().getParent ().getLeft ())) { // parent van z is een left child van grandparent
                    Node y = z.getParent ().getParent ().getRight (); // y is right node van grandparent van z
                    if (y.getColor () == false) { // y is rood
                        z.getParent ().setColor (true); // child van y moet rood zijn (parent van z)
                        y.setColor (true); // child van y moet rood zijn
                        z.getParent ().getParent ().setColor (false); // grandparent van z is rood
                        z = z.getParent ().getParent (); // z is nu grandparent van oude z
                    } else { // y is zwart
                        if (z.Equals (z.getParent ().getRight ())) { // z is een right node van parent
                            z = z.getParent (); // z is nu parent van oude z
                            leftRotate (z); // left rotate
                        }
                        z.getParent ().setColor (true); // parent van z moet zwart zijn
                        z.getParent ().getParent ().setColor (false); // grandparent van z moet rood zijn
                        rightRotate (z.getParent ().getParent ()); // right rotate
                    }
                } else { // parent van z is zwart (kan dus nil zijn)
                    Node y = z.getParent ().getParent ().getLeft (); // y is left node van grandparent van z
                    if (y.getColor () == false) { // y is rood
                        z.getParent ().setColor (true); // child van y moet rood zijn (parent van z)
                        y.setColor (true); // child van y moet rood zijn
                        z.getParent ().getParent ().setColor (false); // grandparent van z is rood
                        z = z.getParent ().getParent (); // z is nu grandparent van oude z
                    } else { // y is zwart
                        if (z.Equals (z.getParent ().getLeft ())) { // z is een left node van parent
                            z = z.getParent (); // z is nu parent van oude z
                            rightRotate (z); // left rotate
                        }
                        z.getParent ().setColor (true); // parent van z moet zwart zijn
                        z.getParent ().getParent ().setColor (false); // grandparent van z moet rood zijn
                        leftRotate (z.getParent ().getParent ()); // right rotate
                    }
                }
            }
            root.setColor (true);
        }
Beispiel #2
0
 public static Node successor(Node x)
 {
     if (!x.getRight().Equals(nil)) {
         return minimum (x.getRight());
     }
     Node y = x.getParent ();
     while (!y.Equals (nil) && x.Equals (y.getRight ())) {
         x = y;
         y = y.getParent ();
     }
     return y;
 }
Beispiel #3
0
 public static void printTree(Node start, int level, string side)
 {
     if (!start.Equals(nil)) {
         Console.WriteLine ("(" + start.getKey() + " - " + start.getColor() + " - " + side + " - s: " + start.getSize() +  " - p: " + start.getPlayerNumber() + " [" + level + "])");
         printTree (start.getLeft (), level + 1, "left");
         printTree (start.getRight(), level + 1, "right");
     }
 }
Beispiel #4
0
 public static void rightRotate(Node x)
 {
     Node y = x.getLeft();
     x.setLeft (y.getRight ());
     if (!y.getRight ().Equals (nil)) {
         y.getRight ().setParent (x);
     }
     y.setParent (x.getParent ());
     if (x.getParent ().Equals (nil)) {
         root = y;
     } else if (x.Equals (x.getParent ().getRight ())) {
         x.getParent ().setRight (y);
     } else {
         x.getParent ().setLeft (y);
     }
     y.setRight (x);
     x.setParent (y);
     y.setSize (x.getSize ());
     x.setSize (x.getRight ().getSize () + x.getLeft ().getSize () + 1);
 }
Beispiel #5
0
 public static Node predecessor(Node x)
 {
     if (!x.getLeft().Equals(nil)) {
         return maximum (x.getLeft ());
     }
     Node y = x.getParent ();
     while (!y.Equals (nil) && x.Equals (y.getLeft ())) {
         x = y;
         y = y.getParent ();
     }
     return y;
 }