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
#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
注意,这里的代码中插入部分可以正常工作,但删除部分不能。如果有哪位对删除部分的实现很熟悉,请指教。