public static void addPlayer(int playerNumber, int score) { Node x = new Node (score); insert(x); players [playerNumber] = x; x.setPlayerNumber (playerNumber); //printTree (root, 0, "center"); }
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 void setRight(Node right) { this.right = right; }
public void setParent(Node parent) { this.parent = parent; }
public void setLeft(Node left) { this.left = left; }
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 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 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 printPart(int playerNumber) { Node x = players[playerNumber]; Node[] list = new Node[10]; int i = 0; while (!(x = predecessor (x)).Equals(nil) && i < 4) { list [3 - i] = x; i++; } i = 0; x = players[playerNumber]; list [4] = x; while (!(x = successor (x)).Equals(nil) && i < 5) { list [5 + i] = x; i++; } for (int n = 9; n >= 0; n--) { if (list[n] != null) { Console.WriteLine (list[n].getPlayerNumber()); } } }
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; }
public static Node minimum(Node x) { while (!x.getLeft().Equals (nil)) { x = x.getLeft (); } return x; }
public static Node maximum(Node x) { while (!x.getRight().Equals(nil)) { x = x.getRight (); } return x; }
public static void insert(Node z) { Node y = nil; Node x = root; // path from root to correct node while (!x.Equals(nil)) { // x is niet nil y = x; if (z.getKey () < x.getKey ()) { // key van z is kleiner dan key van x -> ga naar links x = x.getLeft (); } else { // key van z is groter dan key van x -> ga naar rechts x = x.getRight(); } y.incrementSize (); } z.setParent (y); // y (laatste node in juiste tak) is parent van z if (y.Equals(nil)) { // y (parent van z) is nil -> z is de root root = z; } else if (z.getKey () < y.getKey ()) { // key van z is kleiner dan key van y -> z is left node van y y.setLeft (z); } else { // key van z is groter dan key van y -> z is right node van y y.setRight (z); } z.setLeft (nil); // z heeft geen kinderen z.setRight (nil); // z heeft geen kinderen z.setColor(false); // z is rood z.setSize(1); fixup (z); }