AVL树是一种特殊的二叉搜索树,与红黑树相比,其平均性能略低,但最差性能要好于红黑树。 其实现也主要在于插入和删除之后的调整。完整实现如下: #ifndef _AVL_TREE_H_ #define _AVL_TREE_H_ #include " BSTree.h " template < class T > class AVLTree : public BSTree < T > ... {public: AVLTree(T data = T()) : BSTree(data) ...{ } virtual ~AVLTree() ...{ }public: void insert(T data) ...{ BSTree<T>::insert(data); while (avlnode_ != BTNode<T>::nil()) ...{ avlnode_->factor_ += (avlnode_->data_ > data) ? MORE : LESS; if (avlnode_->factor_ == LOW) balanceLeft(avlnode_); else if (avlnode_->factor_ == HIGH) balanceRight(avlnode_); if (avlnode_->factor_ == NORMAL) break; data = avlnode_->data_; avlnode_ = avlnode_->parent_; } } void remove(T data) ...{ BSTree<T>::remove(data); while (avlnode_ != BTNode<T>::nil()) ...{ avlnode_->factor_ -= (avlnode_->data_ > data) ? MORE : LESS; if (avlnode_->factor_ == LOW) balanceLeft(avlnode_); else if (avlnode_->factor_ == HIGH) balanceRight(avlnode_); if (avlnode_->factor_ == NORMAL) break; data = avlnode_->data_; avlnode_ = avlnode_->parent_; } }private: void balanceLeft(BTNode<T>* x) ...{ if (x->rchild_->factor_ == MORE) rotateRight(x->rchild_); rotateLeft(x); avlnode_ = x->parent_; } void balanceRight(BTNode<T>* x) ...{ if (x->lchild_->factor_ == LESS) rotateLeft(x->lchild_); rotateRight(x); avlnode_ = x->parent_; } void rotateLeft(BTNode<T>* x) ...{ BSTree<T>::rotateLeft(x); BTNode<T> *y = x->parent_; ++(x->factor_) -= y->factor_ < NORMAL ? y->factor_ : NORMAL; ++(y->factor_) += x->factor_ > NORMAL ? x->factor_ : NORMAL; } void rotateRight(BTNode<T>* x) ...{ BSTree<T>::rotateRight(x); BTNode<T> *y = x->parent_; --(x->factor_) -= y->factor_ > NORMAL ? y->factor_ : NORMAL; --(y->factor_) += x->factor_ < NORMAL ? x->factor_ : NORMAL; }} ; #endif 注意,这里的代码中插入部分可以正常工作,但删除部分不能。如果有哪位对删除部分的实现很熟悉,请指教。