public void rotateLeft(RBNode x) {
    // pushing node x down and to the Left to balance the tree. x's Right child (y)
    // replaces x (since y > x), and y's Left child becomes x's Right child
    // (since it's < y but > x).
    
    RBNode y = x.getRight(); // get x's Right node, this becomes y
    
    // set x's Right link
    x.setRight(y.getLeft());	// y's Left child's becomes x's Right child
    
    // modify parents
    if(y.getLeft() != sentinelNode)
      y.getLeft().setParent(x);		// sets y's Left Parent to x
    
    if(y != sentinelNode)
      y.setParent(x.getParent());	// set y's Parent to x's Parent
    
    if(x.getParent() != null) {	// determine which side of it's Parent x was on
      if(x == x.getParent().getLeft())
        x.getParent().setLeft(y);			// set Left Parent to y
      else
        x.getParent().setRight(y);			// set Right Parent to y
    } else
      setRoot(y);						// at root, set it to y
    
    // link x and y
    y.setLeft(x);			// put x on y's Left
    if(x != sentinelNode)		// set y as x's Parent
      x.setParent(y);
  }