数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除

文章目录

    • 定义
      • `AVL树`
      • `AVL搜索树`
      • `带索引的AVL搜索树`
      • `AVL树特征`
    • AVL树的描述
      • AVL搜索树的`搜索`
      • AVL搜索树的`插入`
        • `LL旋转`
          • 模型抽象
          • 流程示例
        • `RR旋转`
          • 模型抽象
          • 流程示例
        • `LR旋转`
          • 模型抽象
          • 流程示例
        • `RL旋转`
          • 模型抽象
          • 流程示例
        • AVL树`初始化`(插入应用)
          • 一道例题
      • AVL搜索树的`删除`
        • `R0旋转`(L0镜像)
          • 模型抽象
          • 流程示例
        • `R1旋转`(L1镜像)
          • 模型抽象
          • 流程示例
        • `R-1旋转`(L-1镜像)
          • 模型抽象
          • 流程示例

定义

AVL树

  • 空二叉树是AVL树。

  • 如果T是一棵非空的二叉树, T L T_L TL T R T_R TR分别是其左子树右子树,当T满足以下条件时,T是一棵AVL树。

    • T L T_L TL T R T_R TR是AVL树
    • ∣ h L − h R ∣ ≤ 1 |h_L-h_R|≤1 hLhR1 h L h_L hL h R h_R hR分别是左子树和右子树的高度。
    1. 左右子树均是AVL树
    2. 左子树与右子树的高度之差的绝对值不超过1

AVL搜索树

  • 既是二叉搜索树,也是AVL树

  • AVL树:(a) (b) AVL搜索树:(b)

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第1张图片

带索引的AVL搜索树

  • 既是带索引的二叉搜索树,也是AVL树数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第2张图片

AVL树特征

  • n个节点的AVL树的高度是 O ( l o g n ) O(logn) O(logn)
  • 对于每一个n(n≥0)值,都存在一棵AVL树。
    • 将一个新元素插入到一棵n元素的AVL搜索树中,可得到一棵n+1元素的AVL树,这种插入过程可以在 O ( l o g n ) O(logn) O(logn)时间内完成。
    • 从一棵n元素的AVL搜索树中删除一个元素,可得到一棵n-1元素的AVL树,这种删除过程可以在 O ( l o g n ) O(logn) O(logn)时间内完成。
  • 一棵n元素的AVL搜索树能在 O ( 高度 ) = O ( l o g n ) O(高度)=O(logn) O(高度)=O(logn)的时间内完成搜索。
  • 一棵有n个节点的AVL树的高度
    • 至多: l o g 2 ( n + 2 ) log_2(n+2) log2(n+2)
    • 至少: l o g 2 ( n + 1 ) log_2(n+1) log2(n+1)

AVL树的描述

一般用链表方式来描述,要为每个节点增加一个平衡因子

  • 平衡因子(Balance Factor):节点x的平衡因子bf(x)定义为:x的左子树的高度-x的右子树的高度

  • AVL树平衡因子的可能取值为:-1,0,和1数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第3张图片

AVL搜索树的搜索

即二叉搜索树的搜索

AVL搜索树的插入

二叉搜索树的插入,但得到的树可能不再是AVL树,这时我们需要调整来恢复。每插入一个新节点时,就会调整树的结构

  • 在插入后,A的平衡因子是-2或2,当节点A 已经被确定时,A的不平衡性:

    1. LL:新插入节点在A节点的左子树的左子树中
    2. LR:新插入节点在A节点的左子树的右子树中
    3. RR:新插入节点在A节点的右子树的右子树中
    4. RL:新插入节点在A节点的右子树的左子树中
  • 调整旋转类型

    1. 单旋转:矫正LLRR型不平衡所作的转换

    2. 双旋转:矫正LRRL型不平衡所作的转换

      LR型不平衡的旋转可以看作RR旋转后的LL旋转

      旋转调整后——消除不和谐平衡因子

LL旋转
模型抽象

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第4张图片

流程示例

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第5张图片

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第6张图片

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第7张图片

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第8张图片

RR旋转
模型抽象

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第9张图片

流程示例

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第10张图片

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第11张图片

LR旋转
模型抽象

最后就是A,B,C三个最小的作为左子树,最大的作为右子树,中间大的作为根

流程示例

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第12张图片

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第13张图片

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第14张图片

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第15张图片

RL旋转
模型抽象

最后就是A,B,C三个最小的作为左子树,最大的作为右子树,中间大的作为根

流程示例

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第16张图片

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第17张图片

AVL树初始化(插入应用)
一道例题

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第18张图片
⚠️易错提醒:判断是什么旋转要从最底下最先出现的不正常平衡因子那开始,比如上题在插入9后,要考虑是16\11\9LL旋转,而非7\16\11RL旋转

AVL搜索树的删除

通过执行二叉搜索树的删除,可从AVL搜索树中删除一个元素。但也会导致产生不平衡树。

删除操作参考搜索树的删除,指路14.3操作erase

设q:删除节点的父节点。

  • 如果q新的平衡因子是0,那么它的高度减少了1,需要改变它的父节点(如果有的话)和其他某些祖先节点的平衡因子。数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第19张图片

  • 如果q新的平衡因子是-1或1,那么它的高度与删除前相同,无需改变其祖先的平衡因子值。

  • 如果q新的平衡因子是-2或2,那么树在q节点是不平衡的,需要调整

    • 由删除操作产生的不平衡有六种类型:R0,R1,R-1,L0,L1,L-1。
R0旋转(L0镜像)
模型抽象

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第20张图片

流程示例

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第21张图片

R1旋转(L1镜像)
模型抽象

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第22张图片

流程示例

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第23张图片

R-1旋转(L-1镜像)
模型抽象

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第24张图片

流程示例

数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除_第25张图片

你可能感兴趣的:(数据结构,算法与应用,#,数据结构笔记合集,数据结构,c++)