AVL树的相关概念
- AVL树是带有平衡条件的二叉查找树,这个平衡条件必须容易保持,而且它必须保证树的深度是O(logN)
- 一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树。空树的高度定义为-1,再AVL树的定义中,每一个节点(在其节点结构中)保留高度信息。
- 大致上讲,一个AVL树的高度最多为1.44log(N+2)-1.328,但是实际上的高度只比longN稍微多一点
- 除去可能的插入外,所有的操作都可以以时间O(logN)执行。当进入插入操作时,我们需要更新通向根节点路径上那些节点的所有平衡信息,这个可以通过旋转来完成
- AVL树的节点声明为:
struct AvlTree{
ElementType Element;//关键值
AvlTree* Left;//左子树
AvlTree* Right;//右子树
int Height;//节点的高度
}
旋转操作
- 在插入操作之后,只有那些从插入点到根节点的路径上的节点的平衡可能被改变,当我们沿着这条路径上行到根并更新平衡信息时,我们可以找到一个节点,它的新平衡破坏了AVL树的条件,我们可以通过在第一个这样的节点(即最深不平衡节点)重新调整为AVL树
- 我们把必须重新平衡的点叫做节点a,当高度不平衡时,a的两颗子树的高度差为2,这种平衡有可能出现在下面的四种情况:
- 对a的左儿子的左子树进行一次插入(左-左)
- 对a的左儿子的右子树进行一次插入(左-右)
- 对a的右儿子的左子树进行一次插入(右-左)
- 对a的右儿子的右子树进行一次插入(右-右)
单旋转
单旋转是针对(左-左)和(右-右)情况的,旋转方法是:找离新插入的节点最近的不平衡的树进行调整,以该不平衡的AVL树的根节点和插入点所在的根节点的儿子为对象进行旋转操作