数据结构->AVL树

46 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情

AVL树(平衡二叉树)是什么

平衡二叉树是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1.

image.png

相关概念

  • 平衡因子(BF)-》左子树和右子树高度差。(一般来说平衡因子的绝对值大于1,平衡树二叉树就失衡,需要旋转纠正)
  • 最小不平衡子树 -》距离插入节点最近的,并且平衡因子的绝对值大于1的节点为根节点的子树。

构建AVL树

平衡二叉树构建的基本思想:在构建二叉排序树的过程中,每当插入新结点是,先检查是否因插入而破坏了树的平衡性,若是,则找到最小不平衡子树,在保证二叉排序树特性的前提下,调整最小不平衡子树中各节点之间的链接关系,进行左旋或者右旋,使之成为最新的平衡子树。

旋转方式

  1. 左旋
    • 旧根节点为新根节点的左子树
    • 新根节点的左子树(如果存在)为旧根节点的右子树
  2. 右旋:
    • 旧根节点为新根节点的右子树
    • 新根节点的右子树(如果存在)为旧根节点的左子树

旋转纠正类型

  1. LL 型:插入左孩子的左子树,右旋
  2. RR 型:插入右孩子的右子树,左旋
  3. LR 型:插入左孩子的右子树,先左旋,再右旋
  4. RL 型:插入右孩子的左子树,先右旋,再左旋

image.png

图解

{3,2,1,4,5,6,7,10,9,8}为实例练习刚刚的4种插入方式。

  1. 依次插入3、2、1插入第三个点 1 的时候BF(3)=2,BF(2)=1,LL 型失衡。对最小不平衡树 {3,2,1}进行右旋:
    • 旧根节点(节点3)为新根节点(节点2)的右子树
    • 新根节点(节点2)的右子树(这里没有右子树)为旧根节点的左子树

image.png 2. 依次插入 4 ,5 插入5点的时候BF(3) =-2 BF(4)=-1,RR 型失衡.对最小不平衡树{3,4,5}进行左旋.

  • 旧根节点(节点 3)为新根节点(节点 4)的左子树
  • 新根节点(节点 4)的左子树(这里没有左子树)为旧根节点的右子树

image.png 3. 插入 4 ,5 插入5点的时候BF(2)=-2 BF(4)=-1,RR 型失衡.对最小不平衡树进行左旋.

  • 旧根节点(节点 2)为新根节点(节点 4)的左子树
  • 新根节点(节点 4)的 左子树(节点 3)为旧根节点的右子树

image.png 4. 插入7节点的时候BF(5)=-2, BF(6)=-1,RR型失衡,对最小不平衡树进行左旋.

  • 旧根节点(节点 5)为新根节点(节点 6)的左子树
  • 新根节点的左子树(这里没有)为旧根节点的右子树

image.png 5. 依次插入10,9。插入9点的时候BF(10) = 1,BF(7) = -2,RL型失衡,对先右旋再左旋.右子树先右旋.

  • 旧根节点(节点 10)为新根节点(节点 9)的右子树
  • 新根节点(节点 9)的右子树(这里没有右子树)为旧根节点的左子树

image.png

  1. 最后插入节点8,BF(6)=-2 BF(9)=1,RL型失衡,先右旋再左旋最小不平衡子树的右子树{9,7,10,8}

先右旋

  • 旧根节点(节点 9 {9,10})为新根节点(节点 7)的右子树
  • 新根节点(节点 7)的右子树(这里是节点 8)为旧根节点(节点 9)的左子树

image.png

左旋

  • 旧根节点(节点6{6,5})为新根节点(节点7)的左子树
  • 新根节点的左子树(这里没有)为旧根节点的右子树

image.png

旋转结束

image.png