博客
关于我
AVL树的实现(图文详解)
阅读量:775 次
发布时间:2019-03-24

本文共 1592 字,大约阅读时间需要 5 分钟。

AVL树的实现

AVL树定义

AVL树是一种特殊的二叉搜索树,其设计目的是为了在数据较为有序的情况下,确保查找操作的平均复杂度仍然为O(log n)。与普通二叉搜索树不同,AVL树规定了一些平衡条件,通过定期旋转节点,避免树的高度差异过大。

为什么需要AVL树

发现普通二叉搜索树在数据有序或接近有序的情况下,会逐渐变成一条链状的树,导致查找操作的时间复杂度从理论上的O(log n)退化到实际上的O(n)。为了解决这一问题,AVL树通过严格控制子树高度差异不超过1,保证树的高度并不偏差太大。

AVL树平衡条件

AVL树的平衡条件可以通过平衡因子(balance factor, bf)来衡量。平衡因子定义为“右子树高度 - 左子树高度”。AVL树的平衡因子范围限制在-1、0、1三者之间。

AVL树结构

AVL树的结构与普通二叉搜索树类似,只是在每个节点中增加了平衡因子bf。具体结构定义包括:

  • 左右子树均为AVL树。
  • 平衡因子bf为整型值,值域为-1、0、1。
  • 右子树层数 - 左子树层数 = bf。
  • AVL树的旋转

    AVL树的插入操作通过旋转节点来维持平衡条件,主要有以下几种旋转方式:

    左单旋(Left Rotation)

    新节点插入较高右子树的右侧,需要将该子树向左转动一次。

    右单旋(Right Rotation)

    新节点插入较高左子树的左侧,需要将该子树向右转动一次。

    左右双旋(Left-Right Rotation)

    新节点插入较高左子树的右侧,需要同时进行左旋和右旋。

    右左双旋(Right-Layer Rotation)

    新节点插入较高右子树的左侧,需要同时进行右旋和左旋。

    AVL树插入

    插入步骤如下:

  • 先搜索找到合适的插入位置。
  • 插入新节点。
  • 调整上级节点的平衡因子。
  • 如果平衡因子超出范围(即绝对值大于1),启动旋转调整平衡。
  • 平衡因子调整

    • 新加入的节点会影响父节点的平衡因子。
    • 若父节点平衡因子为1或-1,需要向上调整。
    • 当父节点平衡因子为2或-2时,需要进行旋转调整。

    旋转案例

  • 右旋(Right Rotate)

    • 当新节点在左子树的右侧时,需要将左子树整体向右旋转。
  • 左旋(Left Rotate)

    • 当新节点在右子树的左侧时,需要将右子树整体向左旋转。
  • 左右双旋

    • 新节点插入左子树的右侧,首先左旋再向右旋。
  • 右左双旋

    • 新节点插入右子树的左侧,首先右旋再向左旋。
  • 代码测试

    顺序插入5,3,1

    当插入数字1时,触发右旋调整。

    随机插入10个数

    构建一个AVL树,确保树高的绝对差异不超过1。

    平衡验证

    int Height(Node* root) {    if (!root) return 0;    return (Height(root->_left) > Height(root->_right)) ? (Height(root->_left) + 1) : (Height(root->_right) + 1);}bool is_balance() {    return is_balance(_root);}bool is_balance(Node* root) {    if (!root) return true;    if (Height(root->_left) - Height(root->_right) != root->_bf)        cout << "No AVL Tree" << endl;    return false;    // 检查子树平衡,同时维持自己的平衡条件    return abs(root->_bf) <= 1 && is_balance(root->_left) && is_balance(root->_right);}

    通过上述验证方法,可以确认AVL树是否满足平衡条件。

    转载地址:http://weskk.baihongyu.com/

    你可能感兴趣的文章
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
    查看>>
    NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
    查看>>
    NIH发布包含10600张CT图像数据库 为AI算法测试铺路
    查看>>
    Nim教程【十二】
    查看>>
    Nim游戏
    查看>>
    NIO ByteBuffer实现原理
    查看>>
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NIO Selector实现原理
    查看>>
    nio 中channel和buffer的基本使用
    查看>>
    NIO基于UDP协议的网络编程
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>