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); }
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; }
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"); } }
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); }
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; }