平衡二叉树

平衡二叉树

什么是平衡二叉树

【例】搜索树结点不同插入次序,将导致不同的深度和平均查找长度ASL。

将月份按照不同次序插入二叉搜索树,依据字典顺序比较大小,得到三棵不同的树如下:
平衡二叉树例子1

ASL的不同,导致二叉搜索树的搜索效率不同,ASL越小,搜索效率越高,故引进了平衡二叉树的概念。

一些概念

平衡因子(Balance Factor,简称BF)”: B F ( T ) = h L − h R BF(T)=h_L-h_R BF(T)=hLhR。其中 h L h_L hL h R h_R hR分别为 T T T的左、右子树的高度。

平衡二叉树定义

平衡二叉树(Balanced Binary Tree)(AVL树)
空树,或者
任一结点的左、右子树高度差的绝对值不超过1,即 ∣ B F ( T ) ∣ ≤ 1 |BF(T)| \leq 1 BF(T)1的树。

平衡二叉树的一些性质

n n n为高度是h的平衡二叉树的结点数。结点数最少时:
h = O ( l o g 2 n ) h=O(log_2n) h=O(log2n)
即给定结点数为n的AVL树的最大高度为 O ( l o g 2 n ) O(log_2n) O(log2n)

平衡二叉树的调整

一些概念

当在平衡二叉树中插入新的结点时,有的结点的平衡因子的绝对值会改变并大于1,由此引出两个概念:

  1. 不平衡的“发现者”:在插入新的结点并使得平衡二叉树变成非平衡二叉树时,平衡因子绝对值大于1的结点。
  2. 麻烦结点”:插入时,如果平衡二叉树变成非平衡二叉树,则该结点被称为麻烦结点。

【例】以下平衡树(依据字典顺序判定大小):
平衡二叉树例子2

当插入新节点Nov之后,平衡二叉树变成了非平衡二叉树:
平衡二叉树例子3

插入新结点Nov之后,Mar结点的平衡因子变成了-2,故发现者是Mar结点,而麻烦结点则是Nov结点。

平衡二叉树的调整方法

前提平衡二叉树是一棵二叉搜索树,所以调整之后,一定要保证仍然是一棵二叉搜索树。

根据麻烦结点与离麻烦结点最近的发现者(因为发现者可能有很多个)的相对位置关系可将调整归为以下4种:

  1. RR旋转(右单旋):麻烦结点在发现者右子树右边
    【例】:
    插入前
    平衡二叉树例子2

    插入后
    平衡二叉树例子3

    麻烦结点Nov在离其最近的发现者Mar的右子树的右边,所以这时候需要进行RR旋转
    RR旋转的例子

    RR旋转的基本模式
    RR旋转的基本模式

  2. LL旋转(左单旋):麻烦结点在发现者左子树左边
    【例】:
    插入前
    LL旋转的树插入前
    插入后
    LL旋转的树插入后

    麻烦结点Apr在离其最近的发现者Mar的左子树的左边,所以这时候需要进行LL旋转
    LL旋转的例子

    LL旋转的基本模式
    LL旋转的基本模式

  3. LR旋转:麻烦结点在发现者左子树右边
    【例】:
    插入前
    LR旋转的树插入前

    插入后
    LR旋转的树插入后
    麻烦结点Jan在离其最近的发现者May的左子树的右边,所以这时候需要进行LR旋转
    LR旋转的例子

    LR旋转的基本模式
    LR旋转的基本模式

  4. RL旋转:麻烦结点在发现者右子树左边
    【例】:
    插入前
    RL旋转的树插入前

    插入后
    RL旋转的树插入后

    麻烦结点Feb在离其最近的发现者Aug的右子树的左边,所以这时候需要进行RL旋转
    RL旋转的例子

    RL旋转的基本模式
    RL旋转的基本模式

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值