《算法笔记》读书记录DAY_37

CHAPTER_9  提高篇(3)——数据结构(2)

9.5.1平衡二叉树(AVL)的定义

平衡二叉树(AVL)仍然时是一颗二叉查找树,但是在其基础上增加了“平衡”的特性。所谓平衡是指,对AVL树的任意节点来说,其左子树和右子树的高度之差的绝对值不超过1,其中左子树与右子树的高度差称为该节点的平衡因子。

如下图a就是一颗平衡二叉树。而图b是一颗只有右子树的二叉查找树,从结构上来看它极不平衡,已经退化成单链表。

 

只要能够随时保证每个节点的平衡因子的绝对值小于等于1,AVL的高度就始终能保持O(logn)级别。由于需要对每个结点都得到平衡因子,因此需要在树的结构中加入一个变量height,用以记录以当前节点为根节点的子树的高度:

struct node {
	int v,height;            //v为权值,height为高度 
	node *lchild,*rchild;
};

在这种定义下,如果需要新建一个节点,就可以采用如下写法:

node* newNode(int v) {
	node *newNode=new node;
	newNode->v=v;
	newNode->height=1;
	newNode->lchild=newNode->rchild=NULL;
	return newNode;
}

显然,可以通过下面的函数获取节点root所在子树的高度:

int getHeight(node* root) {
	if(root==NULL)
		return 0;
	return root->height;
}

于是根据定义,可以通过下面函数计算平衡因子了:

int getBalanceFactor(node* root) {
	return getHeight(root->lchild)-getHeight(root->rchild);
}

通过计算左右子树的高度,我们就可以计算当前节点的高度了。显然,当前节点root所在树的高度等于其左子树的高度和右子树的高度的较大值加1。因此可以通过下面函数来更新height:

void updateHeight(node* root) {
	root->height=max(getHeight(root->lchild),getHeight(root->rchild))+1;
}

9.5.2平衡二叉树的基本操作

AVL的操作主要有三种:查找、建立、插入、删除。其中AVL的查找和建树操作和BST是一模一样的,因此只需弄清AVL的插入和删除操作即可。

插入与删除的过程比较复杂,涉及旋转操作,故在此记录不便。

AVL的插入与删除可以参考博客:数据结构——平衡二叉树(AVL树)之插入_两片空白的博客-CSDN博客

数据结构——平衡二叉树之删除_两片空白的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/jgsecurity/article/details/120930240