平衡二叉树(Self-Balancing Binary SearchTree或Height-Balanced Binary Search Tree),是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1。
有两位俄罗斯数学家G.M. Adelson-Velskii和E.M. Landis在1962年共同发明一种解决平衡二叉树的算法,所以有不少资料中也称这样的平衡二叉树为AVL树。
从平衡二叉树的英文名字,你也可以体会到,它是一种高度平衡的二叉排序树。那什么叫做高度平衡呢?意思是说,要么它是一棵空树,要么它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。我们将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF(Balance Factor),那么平衡二叉树上所有结点的平衡因子只可能是-1、0和1。只要二叉树上有一个结点的平衡因子的绝对值大于1,则该二叉树就是不平衡的。
距离插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树,我们称为最小不平衡子树。
平衡二叉树构建的基本思想就是在构建二叉排序树的过程中,每当插入一个结点时,先检查是否因插入而破坏了树的平衡性,若是,则找出最小不平衡子树。在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。
我们可以总结出平衡二叉树的构建过程如下:
- 首先,按照二叉排序树的规则,逐个将数组中的元素插入到平衡二叉树中。
- 在插入过程中,每次插入一个节点后,需要查找从插入位置到根节点的路径上的所有节点,检查它们的平衡因子(平衡因子为左子树高度减去右子树高度)是否超出了平衡范围(-1,0,1)。
- 如果发现某个节点的平衡因子超出了平衡范围,就需要对最小不平衡子树进行调整。最小不平衡子树是指离插入节点最近的不平衡节点和它的子树。
- 当最小不平衡子树的根节点的平衡因子为正(大于1)时,进行右旋操作。右旋操作是将根节点的左孩子升级为新的根节点,根节点成为新根节点的右孩子,新根节点的右孩子成为原根节点的左孩子。
- 当最小不平衡子树的根节点的平衡因子为负(小于-1)时,进行左旋操作。左旋操作是将根节点的右孩子升级为新的根节点,根节点成为新根节点的左孩子,新根节点的左孩子成为原根节点的右孩子。
- 如果最小不平衡子树的根节点与它的子树的平衡因子符号相反,先对最小不平衡子树的根节点的子节点进行旋转操作,使得它们的平衡因子符号相同,然后再对最小不平衡子树的根节点进行相反的旋转操作。
- 重复以上步骤,直到整棵树都平衡。
通过这样的构建过程,我们可以将一个数组构建成一棵高度平衡的二叉排序树(即平衡二叉树),从而提高查找的效率。平衡二叉树的高度接近log(n),因此查找的时间复杂度近似于O(log(n)),相比于普通二叉排序树的O(n),查找效率大大提升。