数据结构学习笔记——AVL树

一:AVL树

平衡树(Balanced Tree):最坏情况下的高度为O(logn)的树。如果搜索树的高度总是O(logn),那么查找、插入和删除的时间为O(logn)。

AVL树:一种平衡树,由Adelson-Velskii和Landis提出,以他们名字命名。左右子树都是AVL树,左右子树的高度差不超过1。

AVL搜索树:既是二叉搜索树,也是AVL树。

索引AVL搜索树:既是索引二叉树,也是AVL树。

二叉搜索树的介绍见:https://blog.csdn.net/zhao_h/article/details/79674487

二:AVL树的特征

1.一棵n个元素的AVL树,其高度是O(logn);

2.对于每一个n,n>=0,都存在一棵AVL树;

3.对每一棵n个元素的AVL搜索树,在O(高度)=O(logn)的时间内可以实现查找;

4.将一个新元素插入一棵n元素的AVL搜索树中,可以得到一棵n+1个元素的AVL树,而且插入用时为O(logn);

5.将一个元素从一棵n元素的AVL树中删除,可以得到一棵n-1个元素的AVL树,而且删除用时为O(logn)。

总结:AVL树的高度是O(logn),查找、插入、删除的时间都是O(logn)。

三:AVL树的描述

AVL树一般用链表描述。为每个节点增加一个平衡因子。

平衡因子bf:左子树高度减去右子树高度

平衡因子的取值为:-1,0,1

四:AV搜索L树的查找

和二叉搜索树的查找操作一样,从根开始查找,如果key比根的关键字小,则在左子树中找,否则在右子树中找

五:AVL搜索树的插入

使用二叉搜索树的插入可能导致AVL树不再平衡。

一棵树不再平衡的过程是:在插入操作之后,平衡因子bf的值由-1变为-2,或者由1变为2。

节点A的不平衡情况可以分为四类:LL,LR,RR,RL

LL:新插入的节点在A节点的左子树的左子树中

LR:新插入的节点在A节点的左子树的右子树中

RR:新插入的节点在A节点的右子树的右子树中

RL:新插入的节点在A节点的右子树的左子树中

单旋转:矫正LL和RR型不平衡所做的转换。(下图圈中是平衡因子)

《数据结构学习笔记——AVL树》

双旋转:矫正LR和RL型不平衡所做的转换。

《数据结构学习笔记——AVL树》

如果插入导致不平衡,那么一次单步旋转就可以恢复平衡。

AVL搜索树插入的步骤:

1.沿着根节点开始的路径,根据新元素的关键字,去寻找新元素的插入位置,过程类似二叉搜索树的插入寻找位置的过程。在此过程中,记录最新发现平衡因子为-1或1的节点,并令其为A节点。如果找到了具有相同关键字的元素,则插入失败(因为AVL树是二叉搜索树,关键字唯一);

2.如果步骤1中没发现A节点,就从根节点开始沿着查找路径修改平衡因子的值;

3.如果平衡因子bf(A)=1并且新节点插入在A的右子树中,或者bf(A)=-1并且新节点插入到左子树,那么A的平衡因子为0。这种情况下,修改从A到新节点途中的平衡因子的值;

4.确定A的不平衡类型并执行相应的旋转,并修改新子树根节点至新插入节点的路径上的节点的平衡因子的值。

六:AVL搜索树的删除

设q是被删除节点的父节点,被删除的节点永远是叶节点(如果删除的不是叶节点,沿着从被删除节点到叶节点的路径将元素向上传递,过程如图所示)。

《数据结构学习笔记——AVL树》

如果删除发生在q的左子树,那么q的高度减去1,如果删除发生在q的右子树,那么q的高度加上1。删除的几种情形如下:

1.如果q的新平衡因子是0,那么它的高度减少了1,这时需要改变它的父节点的平衡因子,而且可能需要改变其他祖先节点的平衡因子的值;

2.如果q的新平衡因子是-1或1,那么它的高度和删除前相同,而且无需改变其祖先的平衡因子值;

3.如果q的新平衡因子是-2或2,那么树在q处是不平衡的。

令不平衡的节点为A,如果删除发生在A的左子树,那么不平衡的类型就是L型,反之,不平衡类型就是R型。

设A有一棵以B为根的左子树,根据左子树B的平衡因子bf的值,可以将一个R型不平衡细分为R0,R1,R-1,分别如下:

R0型矫正:

《数据结构学习笔记——AVL树》

R1型矫正:

《数据结构学习笔记——AVL树》

R-1型矫正:

《数据结构学习笔记——AVL树》

R0和R1型旋转都是单旋转。

R-1型旋转是双旋转,节点A和B在旋转后的平衡因子的值取决于B的右孩子的平衡因子b。

    原文作者:AVL树
    原文地址: https://blog.csdn.net/zhao_h/article/details/79693209
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞