+ [五. 验证AVL树](#_AVL_620)
+ [六. AVL树的性能](#_AVL_693)

一. AVL树的概念
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。
因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度
一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:
- 它的左右子树都是AVL树
- 左右子树高度之差(简称 平衡因子)的绝对值不超过1(-1/0/1)
- 平衡因子= 右子树高度 - 左子树高度;非必须,也可以不要,只是方便我们实现的一种方式!

如果一棵二叉搜索树是高度平衡的,它就是AVL树。如果它有n个结点,其高度可保持在
O
(
l
o
g
2
n
)
O(log_2 n)
O(log2n),搜索时间复杂度O(
l
o
g
2
n
log_2 n
log2n)
单支树的效率是
O
(
N
)
O(N)
O(N),AVL树不一样,在10亿中只用找30次(可能多一点)

二. AVL树结点的定义
此处我们定义成三叉链结构 ,方便后序的操作;也在每个节点引入了平衡因子(右子树高度-左子树高度),还需要实现一下构造函数,左右子树以及父节点都是空,再把平衡因子设置为0即可
template<class K, class V>
struct AVLTreeNode
{
//定义三叉链
AVLTreeNode<K, V>\* _left;
AVLTreeNode<K, V>\* _right;
AVLTreeNode<K, V>\* _parent;
//存储的键值对
pair<K, V> _kv;
//平衡因子(balance factor)
int _bf;
//构造函数
AVLTreeNode(const pair<K, V>& kv)
:\_left(nullptr)
,\_right(nullptr)
,\_parent(nullptr)
,\_kv(kv)
,\_bf(0)
{}
};
注意:平衡因子不是必须的,只是我们实现高度平衡的一种方式,不用平衡因子也是可以实现的
三. AVL树的插入
插入节点有三个步骤
- 按照二叉搜索树的原理,找到待插入的
最低0.47元/天 解锁文章
_avl tree&spm=1001.2101.3001.5002&articleId=138238202&d=1&t=3&u=01cbf91d7e5641889faffebd25312c3b)
1万+

被折叠的 条评论
为什么被折叠?



