平衡二叉搜索树插入与删除(AVL)

本文详细介绍了AVL树的引入原因、定义、重平衡策略以及插入和删除操作,包括单旋和双旋的过程。通过对平衡因子的探讨,展示了如何在插入和删除后保持AVL树的平衡,以确保高效的查找效率。
摘要由CSDN通过智能技术生成

目录

1.为何要引入平衡二叉搜索树

2.AVL树的定义

3.将失衡的二叉搜索树重平衡

4.AVL插入 

4.1单旋

4.2双旋

5.AVL的删除

5.1单旋

5.2双旋

6.'3'+'4'重构

7.代码实现


1.为何要引入平衡二叉搜索树

         我们知道,二叉搜索树(BST)已经有比较好的查找,插入和删除的效率。但是为什么不满足于二叉搜索树呢?我们来看一种情况,如图1-1:

         从中可以看到,该树仍满足二叉搜索树的定义,但是,查找效率已经从O(logn)退化为O(n)级别。变成的了一个链表了。我们看到引起这种变化的根本原因是深度的加深和左右子树失衡导致的。平衡二叉树为了解决这种失衡导致算法效率的退化。

2.AVL树的定义

平衡因子在满足二叉搜索树的条件下,对任意结点其左右子树的深度之差的绝对值不超过1。

即| height(左子树)-height(右子树)| \leqslant 1

对于图1-1我们将它进行一定的变换变成了图2-1所示,该树的深度降低了,查找效率也回归到logn级别。  

高度为h的平衡二叉树包含至少包含Fib(h)=Fib(h-1)+Fib(h-2)+1结点数。树高度不超过logn

        通过画图我们可以知道,平衡二叉树最少结点数近似满足斐波拉契数列。我们可以将一棵平衡二叉树拆分为根结点,左子树和右子树。左子树和右子树也是一棵平衡二叉树。如果左子树与右子树等高,并不能保证平衡二叉树的结点数最少,所以左子树与右子树高度相差1。所以最少的节点数为左子树加上右子树加上根结点。Fib(h)=Fib(h-1)+Fib(h-2)+1。我们看到最少的结点数满足递归的定义。在渐进意义上,结点数满足指数增长,所以树的高度不超过logn

3.将失衡的二叉搜索树重平衡

如何将失衡的BST重平衡呢?

我们来看这几种情况,如图3-1所示:

      对于失衡结点,我们可以通过调整树的结构,旋转进行重新平衡。对于图3-1,我们看到四种情况。对于左-左和右-右情况只需要经过一次右旋和一次左旋。对于左-右和右-左这两种情况,需要调整作为中间大小结点作为根结点,再进行旋转。而此过程需要进行两次旋转。如图3-2。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值