携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情
AVL树(平衡二叉树)是什么
平衡二叉树是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1.
相关概念
- 平衡因子(BF)-》左子树和右子树高度差。(一般来说平衡因子的绝对值大于1,平衡树二叉树就失衡,需要旋转纠正)
- 最小不平衡子树 -》距离插入节点最近的,并且平衡因子的绝对值大于1的节点为根节点的子树。
构建AVL树
平衡二叉树构建的基本思想:在构建二叉排序树的过程中,每当插入新结点是,先检查是否因插入而破坏了树的平衡性,若是,则找到最小不平衡子树,在保证二叉排序树特性的前提下,调整最小不平衡子树中各节点之间的链接关系,进行左旋或者右旋,使之成为最新的平衡子树。
旋转方式
- 左旋
- 旧根节点为新根节点的左子树
- 新根节点的左子树(如果存在)为旧根节点的右子树
- 右旋:
- 旧根节点为新根节点的右子树
- 新根节点的右子树(如果存在)为旧根节点的左子树
旋转纠正类型
- LL 型:插入左孩子的左子树,右旋
- RR 型:插入右孩子的右子树,左旋
- LR 型:插入左孩子的右子树,先左旋,再右旋
- RL 型:插入右孩子的左子树,先右旋,再左旋
图解
{3,2,1,4,5,6,7,10,9,8}为实例练习刚刚的4种插入方式。
- 依次插入3、2、1插入第三个点 1 的时候BF(3)=2,BF(2)=1,LL 型失衡。对最小不平衡树 {3,2,1}进行右旋:
- 旧根节点(节点3)为新根节点(节点2)的右子树
- 新根节点(节点2)的右子树(这里没有右子树)为旧根节点的左子树
2. 依次插入 4 ,5 插入5点的时候BF(3) =-2 BF(4)=-1,RR 型失衡.对最小不平衡树{3,4,5}进行左旋.
- 旧根节点(节点 3)为新根节点(节点 4)的左子树
- 新根节点(节点 4)的左子树(这里没有左子树)为旧根节点的右子树
3. 插入 4 ,5 插入5点的时候BF(2)=-2 BF(4)=-1,RR 型失衡.对最小不平衡树进行左旋.
- 旧根节点(节点 2)为新根节点(节点 4)的左子树
- 新根节点(节点 4)的 左子树(节点 3)为旧根节点的右子树
4. 插入7节点的时候BF(5)=-2, BF(6)=-1,RR型失衡,对最小不平衡树进行左旋.
- 旧根节点(节点 5)为新根节点(节点 6)的左子树
- 新根节点的左子树(这里没有)为旧根节点的右子树
5. 依次插入10,9。插入9点的时候BF(10) = 1,BF(7) = -2,RL型失衡,对先右旋再左旋.右子树先右旋.
- 旧根节点(节点 10)为新根节点(节点 9)的右子树
- 新根节点(节点 9)的右子树(这里没有右子树)为旧根节点的左子树
- 最后插入节点8,BF(6)=-2 BF(9)=1,RL型失衡,先右旋再左旋最小不平衡子树的右子树{9,7,10,8}
先右旋
- 旧根节点(节点 9 {9,10})为新根节点(节点 7)的右子树
- 新根节点(节点 7)的右子树(这里是节点 8)为旧根节点(节点 9)的左子树
左旋
- 旧根节点(节点6{6,5})为新根节点(节点7)的左子树
- 新根节点的左子树(这里没有)为旧根节点的右子树
旋转结束