template<class E, class K> class AVLtree2 { private: AVLNode<E,K>* root; void LeftSingleRotate(AVLNode<E,K>*& p ); //左单旋转 void LeftDoubleRotate(AVLNode<E,K>*& p ); //左双旋转 void RightSingleRotate(AVLNode<E,K>*& p ); //右单旋转 void RightDoubleRotate(AVLNode<E,K>*& p ); //右双旋转 void InOutput(const AVLNode<E,K> *p); void PostOutput(const AVLNode<E,K> *p); inline int Height(const AVLNode<E,K>* p) const; inline void Rotate_Help( AVLNode<E,K>*& p ); AVLtree2<E,K>& Insert_Help(AVLNode<E,K>*& p, const E& e ); AVLtree2<E,K>& Delete_Help(AVLNode<E,K>*& p, const K& k, E& e ); public: AVLtree2(){ root = 0; } void Ascend() {InOutput(root); cout << endl;} void PostOut() {PostOutput(root); cout << endl;} AVLtree2<E,K>& Insert( const E& e ); AVLtree2<E,K>& Delete( const K& k, E& e ); }; //================================= // 7 5 // / ==> / / // 5 3 7 // / // 3 //================================= //左单旋转实现 template<class E, class K> void AVLtree2<E,K>::LeftSingleRotate(AVLNode<E,K>*& p ) { AVLNode<E,K>* tmp = p->LeftChild; p->LeftChild = tmp->RightChild; p->height = max( Height(p->LeftChild), Height(p->RightChild) ) + 1; tmp->RightChild = p; p = tmp; p->height = max( Height(p->LeftChild), Height(p->RightChild) ) + 1; } //================================= // 7 8 // / ==> / / // 8 7 9 // / // 9 //================================= //右单旋转实现 template<class E, class K> void AVLtree2<E,K>::RightSingleRotate(AVLNode<E,K>*& p ) { AVLNode<E,K>* tmp = p->RightChild; p->RightChild = tmp->LeftChild; p->height = max( Height(p->LeftChild), Height(p->RightChild) ) + 1; tmp->LeftChild = p; p = tmp; p->height = max( Height(p->LeftChild), Height(p->RightChild) ) + 1; } //================================= // 4 4 3 // / / / / // 2 ==> 3 ==> 2 4 // / / // 3 2 //================================= // 左双旋转实现 template<class E, class K> void AVLtree2<E,K>::LeftDoubleRotate(AVLNode<E,K>*& p ) { RightSingleRotate(p->LeftChild ); LeftSingleRotate(p ); } //================================= // 7 7 8 // / / / / // 9 ==> 8 ==> 7 9 // / / // 8 9 //================================= // 右双旋转实现 template<class E, class K> void AVLtree2<E,K>::RightDoubleRotate(AVLNode<E,K>*& p ) { LeftSingleRotate(p->RightChild ); RightSingleRotate(p ); } template<class E, class K> inline int AVLtree2<E,K>::Height(const AVLNode<E,K>* p) const { if (0 == p) return -1; return p->height; } template<class E, class K> AVLtree2<E,K>& AVLtree2<E,K>::Insert_Help(AVLNode<E,K>*& p, const E& e ) { if( p == 0 ) { p = new AVLNode<E,K> (e); return *this; } if (e < p->data) Insert_Help(p->LeftChild, e ); else //e > p->data Insert_Help(p->RightChild, e ); // 调整根结点的高度,因为增加结点后,高度可能增加 p->height= max( Height(p->LeftChild), Height(p->RightChild))+ 1; // 检测左子树是否平衡 if( p->LeftChild ) Rotate_Help( p->LeftChild ); // 检测右子树是否平衡 if( p->RightChild ) Rotate_Help( p->RightChild ); // 检测此节点并调整 Rotate_Help( p ); return *this; } template<class E, class K> AVLtree2<E,K>& AVLtree2<E,K>::Insert( const E& e ) { return Insert_Help( root, e ); } template<class E, class K> void AVLtree2<E,K>::Rotate_Help( AVLNode<E,K>*& p ) { //右子树高度比左子树高度大2 if( Height(p->RightChild) - Height(p->LeftChild) == 2 ) { if( Height(p->RightChild->LeftChild) <= Height(p->RightChild->RightChild) ) RightSingleRotate( p ); else RightDoubleRotate( p ); } //左子树高度比右子树高度大2 else if( Height(p->RightChild) - Height(p->LeftChild) == -2 ) { if( Height(p->LeftChild->RightChild) <= Height(p->LeftChild->LeftChild) ) LeftSingleRotate( p ); else LeftDoubleRotate( p ); } } template<class E, class K> AVLtree2<E,K>& AVLtree2<E,K>::Delete_Help(AVLNode<E,K>*& p, const K& k, E& e ) { if( p == 0 ) return *this; if( k == p->data ) { e = p->data; if( p->RightChild == 0 ) { AVLNode<E,K>* tmp = p; p = p->LeftChild; delete tmp; } else { AVLNode<E,K>* tmp = p->RightChild; while( tmp->LeftChild != 0 ) tmp = tmp->LeftChild; p->data = tmp->data; Delete_Help( p->RightChild, tmp->data, e ); p->height= max( Height(p->LeftChild), Height(p->RightChild)) + 1; } return *this; } else if( k < p->data ) { Delete_Help( p->LeftChild, k, e ); } else { Delete_Help( p->RightChild, k, e ); } // 调整高度 p->height = max( Height(p->LeftChild), Height(p->RightChild)) + 1; // 检测左子树是否平衡 if( p->LeftChild ) Rotate_Help( p->LeftChild ); // 检测右子树是否平衡 if( p->RightChild ) Rotate_Help( p->RightChild ); // 检测此节点并调整 Rotate_Help( p ); return *this; } template<class E, class K> AVLtree2<E,K>& AVLtree2<E,K>::Delete( const K& k, E& e ) { return Delete_Help( root, k, e ); } template<class E, class K> void AVLtree2<E,K>::InOutput(const AVLNode<E,K> *p) { if(p) { InOutput(p->LeftChild); cout << p->data << " "; InOutput(p->RightChild); } } template<class E, class K> void AVLtree2<E,K>::PostOutput(const AVLNode<E,K> *p) { if(p) { PostOutput(p->LeftChild); PostOutput(p->RightChild); cout << p->data << " "; } } 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kongbu0622/archive/2009/10/08/4642072.aspx
#ifndef AVLNode_ #define AVLNode_ template <class E, class K> class AVLtree; template <class E, class K> class AVLtree2; template <class E, class K> class DAVLtree; template <class E, class K> class AVLNode { friend AVLtree<E,K>; friend AVLtree2<E,K>; friend DAVLtree<E,K>; public: AVLNode() {LeftChild = RightChild = 0;} AVLNode(const E& e){data = e; bf = 0; LeftChild = RightChild = 0; height = 0; } private: E data; int bf; int height; AVLNode<E,K> *LeftChild, *RightChild; }; #endif #ifndef AVLNode_ #define AVLNode_ template <class E, class K> class AVLtree; template <class E, class K> class AVLtree2; template <class E, class K> class DAVLtree; template <class E, class K> class AVLNode { friend AVLtree<E,K>; friend AVLtree2<E,K>; friend DAVLtree<E,K>; public: AVLNode() {LeftChild = RightChild = 0;} AVLNode(const E& e){data = e; bf = 0; LeftChild = RightChild = 0; height = 0; } private: E data; int bf; int height; AVLNode<E,K> *LeftChild, *RightChild; }; #endif 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kongbu0622/archive/2009/10/08/4642072.aspx