1、基本概念 算法
从查找时间上来考虑,高度为n的二叉查找树(Binary Search Tree),在最坏的状况下查找时间为O(n)。而最好的状况下查找时间是O(logn),所以咱们指望二叉树永远处于最好的状况。spa
基于这个指望,1962年阿德尔森-维尔斯和兰迪斯(Adelson-Velskii and Landis)提出了一种节点在高度上相对平衡的二叉查找树,它的平均和最坏状况下的查找时间都是O(logn),同时插入和删除的时间复杂性也会保持O(logn),且在插入或删除以后,高度上仍然保持平衡。这种树称为平衡二叉树(Balanced Binary Tree)。因为提出者的缘由,平衡二叉树也被称为AVL树。3d
2、平衡二叉树的特色 指针
平衡二叉树是一个高级的二叉排序树(Binary Search Tree),除二叉排序树的特色外:blog
(1)左右子树深度差的绝对值不超过1;排序
(2)左右子树也是平衡二叉树。二叉树
平衡因子:BF = 左子树的深度 - 右子树的深度。im
平衡因子的取值只能是一、0、-1。若其绝对值大于,则失去平衡性。margin
3、算法思想
img
若一颗平衡二叉树被插入一个新的节点后失去了平衡性。首先要找出失去平衡的最小子树的根节点的指针。而后调整这颗子树中节点之间的位置关系,使其恢复平衡性。
失去平衡的最小子树是指离插入节点最近且平衡因子绝对值大于1的根节点所在的最小子树。
若A为失去平衡性的最小子树的根节点,则恢复平衡性的办法可概括为如下四种:
(1)LL(左孩子的左子树)型平衡旋转法
插入前:A的左子树B和右子树E的深度分别为1和0,所以A的平衡因子是1,处于平衡状态,
同理,其B子树和E子树也是处于平衡状态的。
插入后:A的左子树B和右子树的深度分别为2和0,所以A的平衡因子是2,处于非平衡状态。
而B子树和E子树此时是处于平衡状态的。
通过以上三个步骤,插入F后的平衡二叉树又恢复了平衡状态,具体过程由下图所示: