平衡二叉树是一种二叉排序树,其中每一个节点的左子树和右子树的高度至多等于1,平衡二叉树又称为AVL树。
将二叉树节点的左子树深度减去右子树深度的值称为平衡因子BF,平衡二叉树上所有节点的平衡因子只可能是-1,0或者1。
距离插入点最近的,且平衡因子的绝对值大于1的结点为根的子树,我们称为最小不平衡子树。
先来看一个例子:
对于数组a[10]={3,2,1,4,5,6,7,10,9,8}构建平衡二叉树。
按照二叉排序树的方式插入新的元素,当插入1的时候,使得当前二叉树失去平衡:
当插入5的时候,使得平衡二叉树再次失去平衡:
插入6的时候,同样产生不平衡:
注意:上面的这些不平衡都有一个共同的特点,那就是最小不平衡子树的根的BF同它的孩子(左孩子或者右孩子)的BF是同号的。所以这是仅需要一次旋转就可以了。
当插入到数字9的时候,同样的发生了不平衡:
从上面的图可以看到一次的旋转是不能做到再次的平衡的。所以要两次旋转。
在插入8的时候,同样的发生了不平衡,同样的需要两次调整:
所以总结上面的过程:
当最小不平衡子树根节点的平衡因子BF是大于1的时候,就右旋,小于-1时就左旋。
插入节点后,最小不平衡子树的BF与它的子树的BF符号相反时,就需要对子树节点先进行一次旋转,以使得符号相同后,在反向旋转一次才能够完成平衡操作。
原文:http://www.cnblogs.com/stemon/p/4839019.html