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为什么LL的时候右转呢?

在AVL树中,当发生LL(左左)情况时,意味着某个节点的左子树的左子节点导致了不平衡。这种情况的特点是:

  1. 不平衡原因:插入的节点位于不平衡节点的左子树的左侧,导致该节点的左子树高度增加,平衡因子变为大于1。

  2. 右旋的必要性:通过右旋,可以将不平衡节点的左子节点提升为新的根节点,同时将原来的不平衡节点下移到右侧。这样可以有效地恢复树的平衡,同时保证二叉搜索树的性质。

示例

考虑一个AVL树,插入节点的顺序为 30, 20, 10,树结构如下:

    30
   /
  20
 /
10
  • 这里,节点 30 的左子树高度为2(节点 20 和 10),右子树高度为0。

  • 因此,平衡因子为 2(即左高度 - 右高度 > 1),表示树不平衡。

右旋操作

通过右旋 30,得到新的结构:

    20
   /  \
  10   30
  • 在这个结构中,树的平衡得到了恢复,所有节点的平衡因子都在 -1 到 1 之间。

  • 同时,二叉搜索树的性质依然保持,即节点的左子树小于根节点,右子树大于根节点。

总结

右旋是解决LL情况的一种有效手段,能通过提升左子节点来恢复AVL树的平衡,同时维护树的排序性质。这种操作使得插入、删除后的高度平衡能持续保持,从而确保查找和修改操作的高效性。

同理, RR的时候,左转也是一样。

Previous疑问NextAVL树中的LR的情况

Last updated 7 months ago