@Override
    public V put( K key, V value ) {
        Node node = mRoot;
        Node newNode = new Node( key, value );

        if( node == null ) {
            insertNode( newNode, node, false );
            return null;
        }

        while( true ) {
            if( mComp.compareMaxes( key, node.mMaxStop.mKey ) > 0 ) {
                node.mMaxStop = newNode;
            }

            int c = mComp.compareMins( key, node.mKey );
            if( c == 0 ) {
                c = mComp.compareMaxes( key, node.mKey );
            }

            if( c < 0 ) {
                if( node.mLeft == null ) {
                    insertNode( newNode, node, true );
                    break;
                }

                node = node.mLeft;

            } else {
                if( node.mRight == null ) {
                    insertNode( newNode, node, false );
                    break;
                }

                node = node.mRight;
            }
        }

        return null;
    }