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博客