平衡二叉树之AVL树
Posted 机器学习算法工程师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了平衡二叉树之AVL树相关的知识,希望对你有一定的参考价值。
我们是谁?
燕哥带你学算法!
我们要干什么?
学算法!
什么时候学?
天天学!
AVL树是最先发明的自平衡二叉查找树。AVL树以其发明者前苏联学者 G.M. Adelson-Velsky 和 E.M. Landis 名字而命名,他们在1962年的论文《An algorithm for the organization of information》中发表了它。
AVL树中,一个非常重要的概念为平衡因子(Balance factor),对于任意节点 x ,其平衡因子定义为该节点右子树和左子树高度差,即 bf(x)=h(x-right)-h(x-left)。
带有平衡因子1、0或 -1的节点被认为是平衡的。带有平衡因子 -2或2的节点被认为是不平衡的,并需要重新平衡这个树。平衡因子可以直接存储在每个节点中,或从可能存储在节点中的子树高度计算出来。
1. AVL树数据结构
为了方便计算每个节点的平衡因子,对二叉树的数据结构进行修改,增加一个数据单元用于记录以该节点为root的子树高度,重新定义数据结构如下(代码采用C实现):
2. AVL树旋转操作
AVL在插入和删除节点造成不平衡的时候需要对发生不平衡的节点及时调整,调整方法为旋转操作。根据造成不平衡的节点出构型可分为:LL 、RR 、LR 、RL型,对应的操作则为单旋和双旋,下面分析一下各种构型具体操作方法。
下图所示为LL构型,在B节点的左子树上插入节点导致A节点失衡,调整过程为:以B节点为轴心,A节点顺时针旋转至B的右子树,A的右子树又B的右子树代替。通过右旋操作,返回以B为Root的平衡子树。 RR够型和LL够型成对称关系,操作方向相反,此处就省略了。
下图所示为LR构型,在B节点的右子树上插入新节点导致A节点失衡,调整过程分两个步骤:首先以C为轴心,B绕C逆时针旋转,生成的子树作为A的左子树;这样就变化成了LL型,然后用上图所示的方法调整即可。通过先左旋后右旋,返回以C为Root的平衡子树。RL型和LR型呈对称状,此处也省略。
下表列出节点够型和选择操作关系。
构型 |
操作 |
对应的函数 |
LL型 |
单旋: 右旋 |
|
RR型 |
单旋:
|
|
LR型 |
双旋: |
|
RL型 |
双旋: |
3. 插入节点
向AVL树中插入节点后,要判断是否引起失衡,如果失衡则需要进一步确定构型,选择合适的基本旋转操作来调整。
4. 删除节点
从AVL树中删除节点分为两个步骤:首先删除节点;然后调整平衡。删除操作对应为插入操作的逆向操作,调整平衡的时候也需要确定被删除节点的分支构型来选择合适的旋转方法。
5. 测试
分别对 查找二叉树 和 AVL树进行下列操作:依次插入 0-15 ;依次删除 0, 3,6,10,15。测试结果如下:
对比来看, 查找二叉树退化为线性,而AVL树则形态匀称。
燕哥带你学算法
进群,学习,得帮助
你的关注,我们的热度,
我们一定给你学习最大的帮助
以上是关于平衡二叉树之AVL树的主要内容,如果未能解决你的问题,请参考以下文章