数据结构笔记(3)树——AVL树以及恼人的旋转

AVL树

  1. 带有平衡条件的二叉查找树——每个节点的左子树和右子树的高度最多差1的二叉查找树。
  2. 空树的高度定义为-1。
  3. 当插入节点时,有可能破坏AVL树的平衡性,分为以下几种情形:
    • 对a的左儿子的左子树进行一次插入(左左/LL)
    • 对a的右儿子的右子树进行一次插入(右右/RR)
    • 对a的左儿子的右子树进行一次插入(左右/LR)
    • 对a的右儿子的左子树进行一次插入(右左/RL)
  4. 对于以上四种情形,可分为两类,前两者通过单旋转解决,后两种通过双旋转解决。
单旋转:

《数据结构笔记(3)树——AVL树以及恼人的旋转》

可以看出节点8成为了插入后被破坏平衡的点,则在该点与其子节点间做一次单旋转(-8–9-),图示为对RR情况进行的逆时针旋转。

单旋转将被破坏平衡的点降下一单位高度,其子树提升至其原来的位置。

值得一提的是,如果节点9拥有左子树(8< x <9)需要将该树(x)添加到8节点的右子树上以保持整个树仍为二叉查找树。

《数据结构笔记(3)树——AVL树以及恼人的旋转》

双旋转:

《数据结构笔记(3)树——AVL树以及恼人的旋转》

  • 易知当插入节点14后,被破坏平衡的节点为6,插入方式为右左:
    1. 先将右儿子向右转。
    2. 再将根向左转。
  • 双旋转先解决被插入的儿子,再解决根节点。
  • 在进行旋转时,同样要遵守“过继”的原则,就是把被提升节点的对应子树赋给其新子树的对应位置。(emmmm,不是很好形容,但是我觉得“过继”这个词很传神。)
    原文作者:AVL树
    原文地址: https://blog.csdn.net/zhangmo_hust/article/details/78868575
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞