平衡二叉树(AVL),是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1。
AVL树是搜索用的,树的hierarchy本身没什么特别的意义。旋转的关键是,保证平衡,并且中序遍历后的顺序不变。可以把它理解为一个黑箱,查找使用,我们并不需要知道它内部的hierarchy。
在AVL树中,最重要的是理解树的旋转。
我们将AVL树大体分成直线型和折线型,具体分为4种,其旋转要点是:当AVL的某个(或某几个)结点的平衡因子为-2或2时,从新加入的那个点开始,逆着箭头向根节点方向找到距离最近的、平衡因子为-2或2的结点后(一定只有三个结点),旋转这三个结点。
在这段话中,我们首先要知道:什么是平衡因子,怎么算平衡因子?
根据平衡二叉树的定义(每一个节点的左子树和右子树的高度差至多等于1)可知:
所以,根据AVL树的定义,每个节点的BF只可能为1,0,-1这三个数。 在建立平衡二叉树的时候,当某个节点的BF为-2或者2时,这个树就不是平衡二叉树了,我们就要 立刻通过旋转使其恢复成平衡二叉树,也因此不可能出现3、4之类的其他数(当然,在判断一棵树是否是平衡二叉树的时候,BF可能是任何值)。
知道了BF的算法,我们来看具体的旋转,这个博主的图例概括了所有的基本情况
AVL树的旋转操作