文章目录
AVL树简介
AVL树是由GM Adelson - Velsky和EM Landis于1962年发明的。为了纪念其发明者,这树结构被命名为AVL。
AVL树可以定义为高度平衡二叉搜索树,其中每个节点与平衡因子相关联,该平衡因子通过从其左子树的子树中减去其右子树的高度来计算。
如果每个节点的平衡因子在-1
到1
之间,则称树是平衡的,否则,树将是不平衡的并且需要平衡。
平衡系数(k)=高度(左(k)) - 高度(右(k))
如果任何节点的平衡因子为1,则意味着左子树比右子树高一级。如果任何节点的平衡因子为0,则意味着左子树和右子树包含相等的高度。如果任何节点的平衡因子是-1,则意味着左子树比右子树低一级。
AVL树如下图所示。 可以看到,与每个节点相关的平衡因子介于-1和+1之间。 因此,它是AVL树的一个例子。
复杂性
算法 | 平均情况 | 最坏情况 |
---|---|---|
空间 | O(n) | O(n) |
查找 | O(log n) | O(log n) |
插入 | O(log n) | O(log n) |
删除 | O(log n) | O(log n) |
AVL树插入元素
AVL树中的插入的执行方式与在二叉搜索树中执行的方式相同。 新节点作为叶节点添加到AVL树中。 但是,它可能会导致违反AVL树属性,因此树可能需要平衡。
可以通过应用旋转来平衡树。 仅当插入新节点时任何节点的平衡因子受到干扰时才需要旋转,否则不需要旋转。
根据插入的类型,旋转分为四类。
LL 右旋
新节点被插入到关键节点的左子树的左子树中
LL 右旋旋转步骤
- T向右旋转成为L的右节点
- L的右节点Y 移动到 T的左节点上
旋转中心是根节点T的左节点(L)
右旋动图
LR 左右旋
新节点被插入到关键节点的左子树的右子树中
LR 左右旋 两次旋转步骤
- 左旋转
- L节点 左旋转,成为R的左节点
- R的左节店(Y1)左旋转,成为L的右节点(左子节点左转)
- 右旋转
- T节点 右旋转,成为R的右节点
- R的右节点(Y2)右旋转,成为T的左节点(右子节点右转)
旋转中心是根节点T的左节点(R)
RR 左旋
新节点被插入到关键节点的右子树的右子树中
RR 左旋步骤
- T向左旋转成为R的左结点
- R的左节点Y放到T的右节点上
旋转中心是根节点T的右节点(R)。
左旋动图
RL 右左旋
新节点被插入到关键节点的右子树的左子树中