数据结构—平衡二叉树(AVL Tree)(3)

371 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

平衡二叉树(Balanced BinaryTree)又被称为AVL树。 具有以下性质:是一棵空树或其左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树。 平衡二叉树一般是一个有序树,具有二叉树的所有性质,其遍历操作和二叉树的遍历操作相同。

二叉树时间复杂度

avl_001.png

上面左侧图也是二叉树图,不过如果要在这个二叉树进行搜索其时间复杂度也是 O(n)O(n) 平均时间复杂度

ASL=n+12ASL = \frac{n+1}{2}

如果右侧图这样排列那么时间复杂就从 O(n)O(n) 变为了O(h)O(h) 其中是二叉树高度,也就是 h=log(n+1)h = \log(n+1),所以需要平衡二叉树。

计算高度和平衡因子

avl_002.png

我们知道在平衡树定义设计到计算结点高度,那么我们就先介绍一下如何计算结点的高度

  • 对于空结点 H(ϕ)=1H(\phi) = -1 其高度为 -1
  • 对于一个结点树其高度为 0 表示为 H(singlenode)=0H(single\,node)=0
  • 除了空树和只有一个结点的特殊情况以外其他结点高度计算公式如下
H(n)=max(H(TL),H(TR))+1H(n) = \max(H(T_L),H(T_R)) +1

那么计算结点平衡因子公式是用其左子树高度减去右子树高度绝对值

B(n)=H(TL)H(TR)B(n) = |H(T_L) - H(T_R)|

avl_003.png

上面是两个平衡二叉树计算其结点的平衡因子

旋转变换

avl_008.png

有 4 种方式通过旋转可以调整修复不平衡问题,分别是 LL LR RR RL,例如如果做在左结点的左子树上添加新的结点可能原来平衡树变成了不平衡。修复方式就是右旋转(Right Rotation),具体做法如下图

avl_007.png

将 2 提升到 3 位置后方式就是右转,然后对应将各个子树调整到其所在位置,如果对于 RR 在右结点的右子树下添加结点情况,可以左旋转(left Rotion)就是将右子节点提升即可。

avl_006.png

这个图情况相对于比较复杂,也就是在左子节点的右子树下添加结点可能让平衡树变得不再平衡,需要调整将 2 节点进行左旋转(Left ratation)得到了 LL 情况然后在右旋转(Right Ratation)就可以得到一颗平衡树。