目录
1.为何要引入平衡二叉搜索树
我们知道,二叉搜索树(BST)已经有比较好的查找,插入和删除的效率。但是为什么不满足于二叉搜索树呢?我们来看一种情况,如图1-1:
从中可以看到,该树仍满足二叉搜索树的定义,但是,查找效率已经从O()退化为O(n)级别。变成的了一个链表了。我们看到引起这种变化的根本原因是深度的加深和左右子树失衡导致的。平衡二叉树为了解决这种失衡导致算法效率的退化。
2.AVL树的定义
平衡因子:在满足二叉搜索树的条件下,对任意结点其左右子树的深度之差的绝对值不超过1。
即| height(左子树)-height(右子树)| 1
对于图1-1我们将它进行一定的变换变成了图2-1所示,该树的深度降低了,查找效率也回归到级别。
高度为h的平衡二叉树包含至少包含Fib(h)=Fib(h-1)+Fib(h-2)+1结点数。树高度不超过。
通过画图我们可以知道,平衡二叉树最少结点数近似满足斐波拉契数列。我们可以将一棵平衡二叉树拆分为根结点,左子树和右子树。左子树和右子树也是一棵平衡二叉树。如果左子树与右子树等高,并不能保证平衡二叉树的结点数最少,所以左子树与右子树高度相差1。所以最少的节点数为左子树加上右子树加上根结点。Fib(h)=Fib(h-1)+Fib(h-2)+1。我们看到最少的结点数满足递归的定义。在渐进意义上,结点数满足指数增长,所以树的高度不超过。
3.将失衡的二叉搜索树重平衡
如何将失衡的BST重平衡呢?
我们来看这几种情况,如图3-1所示:
对于失衡结点,我们可以通过调整树的结构,旋转进行重新平衡。对于图3-1,我们看到四种情况。对于左-左和右-右情况只需要经过一次右旋和一次左旋。对于左-右和右-左这两种情况,需要调整作为中间大小结点作为根结点,再进行旋转。而此过程需要进行两次旋转。如图3-2。