平衡二叉树基础篇
什么是平衡二叉树?
平衡二叉树(Balanced Binary Tree 或 Height-Balanced Tree)又称为 AVL 树,其实就是一颗 平衡的二叉排序树 ,解决了昨天讲的二叉排序树的不平衡问题,即斜树。AVL树或者是一颗空树,或者是具有下列性质的二叉排序树:
它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过 1 。
什么是平衡因子?
平衡二叉树上结点的 平衡因子 BF(Balanced Factor) 定义为该结点的左子树深度减去它的右子树的深度,平衡二叉树上所有结点的平衡因子只可能是 -1,0,1。
上面的两个树就是典型的平衡二叉树,首先它是一颗二叉排序树,其次每一个结点的平衡因子都是 -1,0,1三个数当中的一个。比如上面的左图,红色的数字为结点的平衡因子,对于任意一个叶子结点而言,其左右孩子都为空,左子树的深度为 0 ,右子树的深度为 0 ,所以 AVL树当中的叶子结点的平衡因子都是 0 ;其他结点的平衡因子同样通过左子树深度减去右子树深度可以求得,比如上图中 左侧 的AVL树中,结点 3 的 左子树深度为 2,右子树深度为1 ,所以结点3的平衡因子就是 1;上图中 右侧 的AVL树中,结点 3 的左子树深度为2,右子树深度为3,则平衡因子为 2 - 3 = -1 。再来看看不平衡的情况。
上图中就是不平衡的二叉排序树,非AVL树 。上图 左侧 的树中,结点 6 的平衡因子为 2,该平衡因子是结点 6 左子树深度 3 减去右子树深度 1 所得;右侧 的树中,结点 6 的左子树深度0减去右子树深度2,即为-2, 所以这两棵树都不是平衡二叉树。
什么是左旋?什么又是右旋?
为了确保每一次插入操作后,树仍然是一颗 AVL 树,我们就需要对之前分享的 BST(二叉排序树) 的插入操作进行平衡操作,而左旋和右旋操作就是保证二叉排序树特性的基础之上,维持每一次插入操作后树一直保持AVL树的基本操作。
、 和 分别表示 或 的子树。右旋操作 将 的右子树 作为 的左子树,然后将 作为 的右子树。这样做的原因何在?还记得平衡二叉树的特性是,对于树中的每一个结点,其左子树中的结点均比结点的值小,右子树中结点的值均比结点的值大,那么对于上图 左侧 的树而言, 的右子树