algorithm
  • README
  • 算法题目
    • Page 1
  • 算法基础
    • 堆(大/小顶堆 、优先队列)
      • swift
      • js
      • C++
    • 哈希表(HashTable)
      • 线性探测
        • 稠密哈希表
        • 密集探测哈希表vs线性探测哈希表
      • C拉链法
        • 拉链法是否需要根据负载因子扩容?
      • set的实现
      • map的实现
    • 二叉树
      • 类型
        • AVL树和红黑树的关系与区别比较
      • 存储方式
      • 遍历
        • 前中后序遍历(深度)
          • 递归方式
          • 迭代法
        • 层次遍历(广度)
      • 二叉搜索树
        • 基本概念
        • 代码实现
      • AVL树
        • 基本概念
        • 代码实现
        • 疑问
          • AVL为什么LL的时候右转呢?
          • AVL树中的LR的情况
          • AVL树的调整
          • 删除节点的逻辑
      • 红黑树
        • 基本概念
        • 代码实现
        • 疑问
          • 红黑树和AVL的关系与区别
          • 红黑树和哈希表的关系与区别
          • 为什么有红黑树,比AVL优势在哪里?
    • 运算符
      • 交换两个数(不用临时变量)
  • leetcode结构
    • Javascript
      • 优先队列
    • C++
  • 公司面试题目
    • 汇丰银行
      • 跑步同一个脚印问题
      • 销售系统问题
Powered by GitBook
On this page
  1. 算法基础
  2. 二叉树
  3. AVL树
  4. 疑问

AVL树的调整

在AVL树中,调整是为了保持树的平衡性,主要涉及以下四种不平衡情况,每种情况对应特定的旋转操作来恢复平衡。具体情况如下:

1. LL情况(左左不平衡)

  • 特征:在插入时,某个节点的左子树的左子节点导致不平衡。

  • 结构:

        A
       /
      B
     /
    C
  • 调整:执行右旋转。

  • 操作:

    • 将 B 提升为新的根节点,A 变为 B 的右子节点。

2. RR情况(右右不平衡)

  • 特征:在插入时,某个节点的右子树的右子节点导致不平衡。

  • 结构:

        A
         \
          B
           \
            C
  • 调整:执行左旋转。

  • 操作:

    • 将 B 提升为新的根节点,A 变为 B 的左子节点。

3. LR情况(左右不平衡)

  • 特征:在插入时,某个节点的左子树的右子节点导致不平衡。

  • 结构:

        A
       /
      B
       \
        C
  • 调整:先对 B 左旋,然后对 A 右旋。

  • 操作:

    • 先将 C 提升为 B 的父节点,再将 C 提升为新的根节点。

4. RL情况(右左不平衡)

  • 特征:在插入时,某个节点的右子树的左子节点导致不平衡。

  • 结构:

        A
         \
          B
         /
        C
  • 调整:先对 B 右旋,然后对 A 左旋。

  • 操作:

    • 先将 C 提升为 B 的父节点,再将 C 提升为新的根节点。

处理步骤总结

  • 插入或删除节点后:每次插入或删除操作后,都需要从当前节点开始向上更新高度,并检查每个节点的平衡因子。

  • 选择适当的旋转:根据平衡因子的值判断采取的旋转操作:

    • LL:右旋

    • RR:左旋

    • LR:先左旋后右旋

    • RL:先右旋后左旋

示例

以插入节点 30, 10, 20 为例,展示LR情况的调整:

  1. 插入 30:

        30
  2. 插入 10:

        30
       /
      10
  3. 插入 20(造成LR不平衡):

        30
       /
      10
        \
        20
  4. 调整步骤:

    • 对 10 左旋:

        30
       /
      20
     /
    10
    • 对 30 右旋:

        20
       /  \
      10   30

总结

AVL树的调整机制确保在每次插入或删除操作后,树的平衡性能够得到维护。通过合理的旋转操作,AVL树能够始终保持对数时间复杂度的高效性能。

PreviousAVL树中的LR的情况Next删除节点的逻辑

Last updated 7 months ago