/** Performs up-heap bubbling. */
  protected void upHeap(Position v) {
    Position u;
    while (!T.isRoot(v)) {
      u = T.parent(v);
      if (comp.compare(key(u), key(v)) <= 0) break;
      swapElements(u, v);
      v = u;
    }
  }
  /** Performs down-heap bubbling. */
  protected void downHeap(Position r) {
    while (T.isInternal(r)) {
      Position s;		// the position of the smaller child
      if (!T.hasRight(r))
	s = T.left(r);
      else if (comp.compare(key(T.left(r)), key(T.right(r))) <=0)
	s = T.left(r);
      else
	s = T.right(r);
      if (comp.compare(key(s), key(r)) < 0) {
	swapElements(r, s);
	r = s;
      }
      else 
	break;
    }
  }
  /** Swaps the elements of the two positions. */
  protected void swapElements(Position x, Position y) {
    Object temp = x.element();
    T.replace(x, y.element());
    T.replace(y, temp);
  }
  /** Text visualization for debugging purposes */
  public String toString() {
    return T.toString();
  }