code: private RedBlackTreeNode<Key, Value> delete(RedBlackTreeNode<Key, Value> h, Key key) {
  	// assert get(h, key) != null;
  
  	if (key.compareTo(h.getKey()) < 0) {
  	    if (!isRed(h.getLeft()) && !isRed(h.getLeft().getLeft()))
  		h = moveRedLeft(h);
  	    h.setLeft(delete(h.getLeft(), key));
  	} else {
  	    if (isRed(h.getLeft()))
  		h = rotateRight(h);
  	    if (key.compareTo(h.getKey()) == 0 && (h.getRight() == null))
  		return null;
  	    if (!isRed(h.getRight()) && !isRed(h.getRight().getLeft()))
  		h = moveRedRight(h);
  	    if (key.compareTo(h.getKey()) == 0) {
  		RedBlackTreeNode<Key, Value> x = min(h.getRight());
  		h.setKey(x.getKey());
  		h.setValue(x.getValue());
  		// h.val = get(h.right, min(h.right).key);
  		// h.key = min(h.right).key;
  		h.setRight(deleteMin(h.getRight()));
  	    } else
  		h.setRight(delete(h.getRight(), key));
  	}
  	return balance(h);
      }
docs: delete the key-value pair with the given key rooted at h