public double removeMax() {

	if ( _heap.size() == 0 ) 
	    return -1.0;
	else
	    _size--;

	//store root value for return at end of fxn
	double retVal = peekMax();

	//store val about to be swapped into root
	double foo = _heap.get( _heap.size() - 1);

	//swap last (rightmost, deepest) leaf with root
	swap( 0, _heap.size() - 1 );

	//lop off last leaf
	_heap.remove( _heap.size() - 1);

	// walk the now-out-of-place root node down the tree...
	int pos = 0;
	int maxChildPos;

	while( pos < _heap.size() ) {

	    //choose child w/ max value, or check for child
	    maxChildPos = maxChildPos(pos);

	    //if no children, then i've walked far enough
	    if ( maxChildPos == -1 ) 
		break;
	    //if i am less than my least child, then i've walked far enough
	    else if ( foo >= _heap.get(maxChildPos) ) 
		break;
	    //if i am < max child, swap with that child
	    else {
		swap( pos, maxChildPos );
		pos = maxChildPos;
	    }
	}
	//return removed value
	return retVal;
    }//O(logn)