1.AVL树
1.1.AVL树的概念
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。
一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:
它的左右子树都是AVL树
左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)
如果一棵二叉搜索树是高度平衡的,它就是AVL树。如果它有n个结点,其高度可保持在
,搜索时间复杂度
下面四棵树,一二三是AVL树,每个结点都满足其左右子树高度差的绝对值不超过1,四不是AVL树,因为其3结点的左子树高度是2,右子树高度是0,高度差的绝对值为2
可以看出,相比满二叉树,完全二叉树最后一层会缺一些结点,而AVL树最后两层会缺一些结点。
1.2.AVL树节点的定义
AVL树节点的定义:
template<class K, class V> struct AVLTreeNode { pair<K, V> _kv; AVLTreeNode<K, V>* _left; AVLTreeNode<K, V>* _right; AVLTreeNode<K, V>* _parent; // 右子树-左子树的高度差 int _bf; // balance factor };
注:
1.AVL树使用三叉链,每个树结点中使用_parent成员变量保存其父节点的地址。
2.树节点中有一个_bf成员变量,该成员变量是balance factor的缩写,记录该节点右子树-左子树的高度差。AVL树并没有规定必须要设计平衡因子,这里使用平衡因子只是一个实现的选择,方便控制平衡。