博客
关于我
平衡二叉树(AVL)
阅读量:594 次
发布时间:2019-03-11

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

平衡二叉树(Balanced Binary Search Tree,简称AVL树)是由Adelson-Velskii和Landis于1962年提出的,用于保持二叉排序树的高度较低,减少IO操作时间等关键性性能指标的影响。

定义

平衡二叉树是一个二叉排序树,满足以下条件:

  • 左右子树的深度之差的绝对值不超过1;
  • 左右子树本身也都是平衡二叉树。
  • 每个节点的平衡因子(Balance Factor,BF)定义为左子树深度减去右子树深度,取值范围为-1、0、1。平衡因子绝对值超过1时,该节点的子树即为失衡。

    平衡二叉树算法思想

    当在平衡二叉树中插入或删除节点时,可能导致平衡性破坏。此时需要:

  • 找到插入或删除导致破坏平衡的最小子树,记其根节点为P;
  • 通过旋转调整该子树,使其重新成为平衡子树。
  • 失去平衡的最小子树是插入或删除节点后导致平衡因子绝对值达到2的根节点及其子树的范围。

    平衡旋转操作

    各类型旋转操作如下:

    1. LL型旋转

    在P节点的左孩子左子树插入节点,或P节点的左孩子右子树删除节点后导致P的平衡因子变为2。此时:

    • 将P的左孩子B向右上旋转成为新的根节点;
    • P原为B的左子树,向左下旋转成为B的新右子树。

    2. RR型旋转

    在P节点的右孩子右子树插入节点,或右孩子左子树删除节点后导致P的平衡因子变为-2。此时:

    • 将P的右孩子C向左上旋转成为新的根节点;
    • P原为C的右子树,向右下旋转成为C的新左子树。

    3. LR型旋转

    在P节点的左孩子右子树插入节点后,使P的平衡因子变为2。此时:

    • 先将P的左孩子B的右子树根节点D向左上旋转(逆时针旋转),使其成为B的新左子树;
    • 再将B向右上旋转,使D成为新的根节点,P原左子树旋转为B的新右子树。

    4. RL型旋转

    在P节点的右孩子左子树插入节点后,使P的平衡因子变为-2。此时:

    • 先将P的右孩子C的左子树根节点D向右上旋转(顺时针旋转),使其成为C的新右子树;
    • 再将C向左上旋转,使D成为新的根节点,P原右子树旋转为C的新左子树。

    这些旋转操作保证了在插入或删除节点后,平衡子树始终保持高度平衡,确保了整体树的性能优势。

    平衡二叉树通过旋转操作(3-4次最多一次)调整局部失衡,保持整体平衡,从而实现高效操作和较低的时间复杂度。

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

    你可能感兴趣的文章
    python | werkzeug,一个不可思议的 Python 库!
    查看>>
    python | xlsxwriter,一个实用的 Python 库!
    查看>>
    python | xlwings,一个非常实用的 Excel 相关的 Python 库!
    查看>>
    python | xmltodict,一个非常厉害的 关于XML数据 Python 库!
    查看>>
    python | xonsh,一个超酷的 Python 库!
    查看>>
    python | yagmail,一个实用的 Python 库!
    查看>>
    python | 一文掌握Python的上下文管理器和with语句
    查看>>
    python | 一文看懂Python闭包机制与变量作用域规则
    查看>>
    python读取含中文的json
    查看>>
    python | 如何用Python锁避免并发错误?
    查看>>
    python | 提升代码迭代速度的Python重载方法
    查看>>
    python | 深入理解Python并发编程中的GIL限制与解决方案
    查看>>
    Python | 爬虫实战——亚马逊搜索页监控(附详细源码)
    查看>>
    python | 高效使用Python工具自动生成模块文档的秘诀
    查看>>
    python 一个list去除另一个list中的值
    查看>>
    python 三大框架的 介绍。
    查看>>
    Python 下载的 11 种姿势,一种比一种高级!
    查看>>
    python读取一个文件夹下所有图片_初学Python-找出文件夹下的所有图片
    查看>>
    Python 中 3 个不可思议的返回功能
    查看>>
    python 中 dict 的另一种用法
    查看>>