STL-AVL Tree

AVL Tree

概述

AVL Tree是加了平衡条件的二叉搜索树。其平衡条件的建立是为了确保整棵树的深度为O(logN)。
AVL Tree 规则:
- 二叉搜索树
- 任何节点的左右子树高度相差最多1
Note:二叉搜索树,每个节点都不比它左子树的任意元素小,而且不比它的右子树的任意元素大。

Why

为什么不用二叉搜索树,二叉搜索树的极端情况:
STL-AVL Tree_第1张图片
如图相当于一个链表,在查找上的优势已经全无,这种情况下,查找一个结点的时间复杂度是O(N)。

Rotation

假设有一个结点的平衡因子(左右高度差)为2,即出现了不平衡的情况,那么就需要进行调整。由于一个结点最多只有两个子节点,所以当高度不平衡时,可能是如下4中情况:
STL-AVL Tree_第2张图片
其中情况1,4对称,称为外侧(ouside)插入,可以采用单旋转操作(Single Rotation)调整解决。情况2,3彼此对称,称为内侧(inside)插入,可以采用双旋转(Double Rotation)调整解决。

单旋转(Single Rotation)

在外侧插入状态中,插入元素11后,k2-插入前平衡,插入后不平衡
k2的左子树比右子树高2层。
STL-AVL Tree_第3张图片
首先我们要找到,插入元素后,使之不平衡的节点,在上图中是k2。
为了调整平衡状态,我们希望将k2的左子树A提高一层,并将右子树C下降一层。上图中右侧即是调整后的情况。
我们可以这么看,把k1向上提起,使k2自然下滑,并将B子树挂到k2的左侧。这么做是因为,二叉搜索树的规则使我们知道,k2>k1,所以k2必须成为新树形中的k1的右子节点。二叉搜索树的规则告诉我们,B子树的所有节点的键值都在k1和k2之间,所以新树形中的B树必须落在k2的左侧。

双旋转(Double Rotation)

下图左侧为内侧插入所造成的不平衡状态。单旋转无法解决这种情况。
- 我们不能再以k3为根节点
- 我们也不能将k3和k1做一次单旋转,因为旋转后还是不平衡
唯一的可能是以k2为新的根节点,这使得(根据二叉搜索树的规则)k1必须成为k2的左子节点,k3必须成为k2的右子节点。新的树形满足AVL-Tree的平衡条件,并且恢复了节点插入之前的高度,因为保证不再需要任何调整。
STL-AVL Tree_第4张图片
旋转的方法:
STL-AVL Tree_第5张图片

你可能感兴趣的:(avl)