0001 template <typename T> bool AVL<T>::remove( const T& e ) { //从AVL树中删除关键码e 0002 BinNodePosi<T>& x = search( e ); if ( !x ) return false; //删除失败 0003 removeAt( x, _hot ); _size--; //先按BST规则删除之(此后,原节点之父_hot及其祖先均可能失衡) 0004 for ( BinNodePosi<T> g = _hot; g; g->updateHeight(), g = g->parent ) //逐层上溯 0005 if ( !AvlBalanced( g ) ) //每当发现失衡祖先g,都 0006 rotateAt( tallerChild( tallerChild( g ) ) ); //(采用“3+4”算法)使之复衡 0007 return true; //删除成功 0008 } //可能需做Omega(logn)次调整