前言
AVL树,也叫平衡二叉树,是一种二叉排序树,其中每一个结点的左子树和右子树的高度差至多等于1。同时,将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF,还将距离插入结点最近的且平衡因子的绝对值大于1的结点为根的子树,称为最小不平衡子树
如图:一为一个不平衡二叉排序树,显然时间复杂度较大,二为改进后的平衡二叉树,而在改进的过程中,最重要的就是通过平衡因子来判断是进行左旋还是右旋,如右旋,新增一个节点N后,平衡被打破,需要平衡因子2大于0,需要右旋,就是将其左子树作为根结点,左子树的右子树作为原根结点的左子树,这样做的原因就是根据二叉排序树的左右子树特点来的,很容易想明白
模拟平衡二叉树
不妨构造一个a[10]={3,2,1,4,5,6,7,10,9,8};
大概过程如图所示,其中最重要的就是平衡因子的判断,如果是同号,且绝对值大于1的话,就要做相应的旋转操作,如果是不同号的话,就要通过旋转先转换成同号,在做操作
左右旋操作
|
|
可以通过之前的图来对比看,其实质也就是交互根结点位置和挂接新左右子树
左右平衡旋转
|
|
插入与主函数
|
|
最后不得不说,AVL树是在是太复杂了,但是其思想是在是太精妙了,它克服了二叉排序树在查找效率上的不足,通过在插入数据时,就将其变成一个平衡二叉树,从而使其时间复杂度为O(logn)