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树

基本概念

AVL树(Adelson-Velsky and Landis Tree)是一种自平衡的二叉搜索树,以保证插入、删除和查找操作的时间复杂度为 (O(\log n))。它由Georgy Adelson-Velsky和Evgenii Landis于1962年提出。

AVL树的特性

  1. 自平衡性:

    • 每个节点的左子树和右子树的高度差(平衡因子)必须在 -1 到 +1 之间。平衡因子定义为: [ \text{Balance Factor} = \text{height(left subtree)} - \text{height(right subtree)} ]

    • 这确保了树的高度保持对数级别,避免了退化为链表的情况。

  2. 节点结构:

    • 每个节点除了存储值和指向左右子节点的指针外,还需要存储该节点的高度(或子树的高度)。

AVL树的操作

  1. 插入:

    • 与普通二叉搜索树相似,首先找到适合插入的位置。

    • 插入后,更新每个祖先节点的高度,并检查是否违反了平衡条件。如果平衡因子超出范围,则通过旋转操作恢复平衡。

    • 可能的旋转操作有:

      • 单右旋:用于左左情况。(LL)

      • 单左旋:用于右右情况。(RR)

      • 左右旋:用于左右情况。(LR)

      • 右左旋:用于右左情况。(RL)

  2. 删除:

    • 删除操作与普通二叉搜索树相似,首先找到要删除的节点。

    • 删除后,更新每个祖先节点的高度,并检查是否需要恢复平衡,执行相应的旋转。

  3. 查找:

    • 查找操作与普通二叉搜索树相同,时间复杂度为 (O(\log n))。

  4. 遍历:

    • AVL树支持常见的遍历方式,如前序遍历、中序遍历和后序遍历。中序遍历会按升序输出节点值。

AVL树的优缺点

优点:

  • 高效性:保证了 (O(\log n)) 的时间复杂度,适合频繁插入和删除操作。

  • 始终保持平衡:通过旋转操作自动维持树的平衡。

缺点:

  • 复杂性:实现相对较复杂,特别是在旋转和高度更新方面。

  • 存储开销:每个节点需要额外存储高度信息,增加了空间开销。

应用场景

  • AVL树适用于需要频繁插入和删除操作的场景,如数据库索引、内存管理等。由于其自平衡特性,能有效保持查找效率。

总结

AVL树是一种有效的自平衡二叉搜索树,通过确保树的高度平衡,使得基本操作的时间复杂度保持在 (O(\log n))。其平衡性和高效性使其成为许多应用程序中的常用数据结构。

PreviousAVL树Next代码实现

Last updated 7 months ago