AVL树维基百科:http://zh.wikipedia.org/wiki/AVL树
在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G.M. Adelson-Velsky和E.M. Landis,他们在1962年的论文《An algorithm for the organization of information》中发表了它。
原理请看上面维基百科词条,可以参考严蔚敏数据结构或其它书籍,这里就不对原理做过多解释了,下面将直接给出其实现,代码有详细注释。
1、基本约定
使用平衡二叉树就是为了高效的查找,一般是根据关键字查找记录,而记录一般是复杂的类型对象。这里我们以一个Student类作为记录类型,学号作为关键字。
我们假定所使用的元素类型,都能进行各种比较和赋值。用LH,EH,RH分别表示左子树高,等高,右子树高,即平衡因子-1、0、1。
#define LH +1 //左高
#define EH 0 //等高
#define RH -1 //右高
#define EQ(a,b) ((a) == (b))
#define LT(a,b) ((a) < (b))
#define LQ(a,b) ((a) <= (b))
//结点元素类型
typedef struct Student
{
int key;
string major;
Student(){}
Student(int k,string s) : key(k), major(s){}
}ElementType;
ostream& operator<<(ostream& out, const Student& s)
{
out<<"("<<s.key<<","<<s.major<<")";
return out;
}
istream& operator>>(istream& in,Student& s)
{
in>>s.key>>s.major;
}
typedef int KeyType;//关键字类型
typedef struct AVLNode
{
ElementType data;
int bf;
struct AVLNode* lchild;
struct AVLNode* rchild;
AVLNode(){}
AVLNode(ElementType& e, int ibf=EH, AVLNode* lc=NULL, AVLNode* rc=NULL)
: data(e), bf(ibf), lchild(lc),rchild(rc){}
}AVLNode, *AVL;
2、初始化、销毁
/*
*Description: 初始化(其实可以不用)
*/
void initAVL(AVL& t)
{
t = NULL;
}
/*
*Description: 销毁平衡二叉树
*/
void destroyAVL(AVL& t)
{
if(t)
{
destroyAVL(t->lchild);
destroyAVL(t->rchild);
delete t;
t = NULL;
}
}
3、遍历和查找
//前序遍历
void preOrderTraverse(AVL t)
{
if(t)
{
cout<<t->data<<" ";
preOrderTraverse(t->lchild);
preOrderTraverse(t->rchild);
}
}
//中序遍历
void inOrderTraverse(AVL t)
{
if(t)
{
inOrderT