平衡二叉树(AVL)的插入和删除详解(上)

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
  • 0
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值