上网借鉴人家的,并没有进行测试。
#ifndef AVLTree_H
#define AVLTree_H
template<typename T>
class AVLTree
{
AVLTree();
AVLTree(const AVLTree & rhs);
~AVLTree();
const T & findMin() const;
const T & findMax() const;
bool contains(const T & x) const;
bool isEmpty() const;
void printTree() const;
void makeEmpty();
void insert(const T & x);
void remove(const T & x);
const AVLTree & operator=(const AVLTree & rhs);
private:
struct AVLNode
{
T element;
int height;
AVLNode * left;
AVLNode * right;
AVLNode(const T & theElement,AVLNode *lt = NULL,AVLNode *rt = NULL,int h = 0):element(theElement),left(lt),right(rt),height(h) {}
};
AVLTree * root;
int max(int a,int b)
{
return a > b ? a:b;
}
void insert(const T & x,AVLTree * &t) const
{
if(t == NULL)
t = new AVLNode(x);
else if(x < t->element)
{
insert(x,t->left);
if(height(t->left) - height(t->right) == 2)
{
if(x < t->element->left)
{
rotateWithLeftChild(t);
}
else
{
doubleWithLefrChild(t);
}
}
}
else if(x > t->element)
{
insert(x,t->right);
if(height(t->right) - height(t->left) == 2)
{
if(x > t->right->element)
rotateWithRightChild(t);
else
doubleWithRightChild(t);
}
}
else
t -> height = max(height(t->left),height(t->right) ) +1;
}
void remove(const T & x,AVLNode * &t) const
{
if(t == NULL)
return ;
if(x == t->element)
{
if(t->right == NULL) //如果t的右儿子为空则直接删除
{
AVLNode* temp = t;
t = t->left;
delete temp;
}
else //否则,找t->right的最左儿子来替代(即t的直接后继)
{
AVLNode* temp = t->right;
t->element = findMin(temp)->element;
t->right = remove(t->element,t->right);
t->height = max(height(t->left),height(t->right)) + 1;
}
return t;
}
else if(x < t->element)
t->left = remove(x,t->left);
else
t->right = remove(x,t->right);
t->height = max(height(t->left),height(t->right)) + 1;
if(t->left != NULL)
t->left = rotate(t->left);
if(t->right != NULL)
t->right = rotate(t->right);
t = rotate(t);
return t;
}
AVLNode * findMin(AVLNode * t) const
{
if(t == NULL)
return NULL;
else
{
while(t->left != NULL)
t = t->left;
return t;
}
}
AVLNode * findMax(AVLNode * t) const
{
if(t == NULL)
return NULL;
else
{
while(t->right != NULL)
t = t->right;
return t;
}
}
bool contains(const T & x,AVLNode *t) const
{
if(t == NULL)
return false;
else if(x < t->element)
return contains(x,t->left);
else if(c > t->element)
return contains(x,t->right);
else
return true;
}
void makeEmpty(AVLNode *t) const
{
if(t == NULL)
;
else
{
makeEmpty(t->left);
makeEmpty(t->right);
delete t;
t = NULL;
}
}
AVLNode * clone(AVLNode * t) const
{
if(t == NULL)
return NULL;
else
return new AVLNode(t->element,clone(t->left),clone(t->right));
}
void printTree(AVLNode * &t) const
{//这里采用中缀遍历
cout << t->element << endl;
printTree(t->left);
printTree(t->right);
}
int height(AVLNode * t) const
{
return t == NULL ? -1 : t->height;
}
AVLNode* rotateWithLeftChild(AVLNode * & k2)
{
AVLNode * k1 = k2->left;
k2->left = k1->right;
k1->right = k2;
k2->height = max(height(k2->left),height(k2->right)) +1;
k1->height = max(height(k2->left),height(k2->right)) +1;
k2 = k1;
return k1;
}
AVLNode* doubleWithLeftChild(AVLNode * & k3)
{
rotateWithLeftChild(k3->left);
return rotateWithLeftChild(k3);
}
AVLNode* rotateWithRightChild(AVLNode * & k2)
{
AVLNode * k1 = k2->right;
k2->right = k1->left;
k1->left = k2;
k2->height = max(height(k2->right),height(k2->left)) +1;
k1->height = max(height(k2->right),height(k2->left)) +1;
k2 = k1;
return k1;
}
AVLNode* doubleWithRightChild(AVLNode * & k3)
{
rotateWithRightChild(k3->right);
return rotateWithRightChild(k3);
}
//对单个结点进行AVL调整
AVLNode* rotate(AVLNode * t)
{
if(height(t->left) - height(t->right) == 2)
{
if(height(t->left->left) >= height(t->left->right))
t = rotateWithLeftChild(t);
else
t = doubleWithLeftChild(t);
}
else if(height(t->right) - height(t->left) == 2)
{
if(height(t->right->right) >= height(t->right->left))
t = rotateWithRightChild(t);
else
t = doubleWithRightChild(t);
}
return t;
}
};
#endif
#include "AVLTree.h"
#include <iostream>
using namespace std;
template<typename T>
AVLTree<T>::AVLTree()
{
root = NULL;
}
template<typename T>
AVLTree<T>::AVLTree(const AVLTree & rhs)
{
root = NULL;
*this = rhs;
}
template<typename T>
AVLTree<T>::~AVLTree()
{
makeEmpty();
}
template<typename T>
const T & AVLTree<T>::findMin() const
{
if(!isEmpty())
return findMin(root)->element;
}
template<typename T>
const T & AVLTree<T>::findMax() const
{
if(!isEmpty())
return findMax(root)->element;
}
template<typename T>
bool AVLTree<T>::contains(const T & x) const
{
return contains(x,root);
}
template<typename T>
bool AVLTree<T>::isEmpty() const
{
return root == NULL;
}
template<typename T>
void AVLTree<T>::printTree() const
{
if(isEmpty())
cout << "Empty tree." << endl;
else
printTree(root);
}
template<typename T>
void AVLTree<T>::makeEmpty()
{
makeEmpty(root);
}
template<typename T>
void AVLTree<T>::insert(const T & x)
{
insert(x,root);
}
template<typename T>
void AVLTree<T>::remove(const T & x)
{
remove(x,root);
}
/* Deep Copy*/
template<typename T>
const AVLTree<T> &AVLTree<T>::operator=(const AVLTree<T> & rhs)
{
if( this != &rhs )
{
makeEmpty();
root = clone(rhs.root);
}
return *this;
}