平衡二叉搜索树(Balanced Binary Tree)

平衡二叉搜索树是一种结构平衡的二叉搜索树,它的每个结点的左右两颗子树的高度差都不超过一的二叉树。它可以在平均和最坏情况下都在 O ( l o g n ) O({\bf log}n) O(logn)的时间复杂度内完成插入、删除和查询等操作。

正常的二叉搜索树最好可以在 O ( l o g n ) O({\bf log} n) O(logn)的时间内完成查询等操作,但是如果二叉树退化为单链表,那么其的搜索效率降低为 O ( n ) O(n) O(n)。因此提出了平衡二叉搜索树,来保持树左右两端深度的平衡。

定义

平衡二叉搜索树又叫AVL树,简称为平衡二叉树,它需要满足以下性质:

  1. 可以为空树。
  2. 如果不为空树,则任意一个结点的左子树和右子树都是平衡二叉树,且高度之差的绝对值不超过1。

为了度量一颗二叉搜索树是否为平衡二叉搜索树引入了平衡因子,它是表示某结点左子树和右子树高度的差,平衡二叉树中不存在平衡因子绝对值大于1的结点。

失衡调整

了解平衡调整策略之前先引入一个最小失衡子树的概念:在新插入的结点向上查找,以第一个平衡因子的绝对值超过1的结点为根的子树。平衡二叉树的失衡调整主要通过旋转最小失衡子树实现的(旋转的目的是为了调整左右子树的高度,哪棵子树高哪棵子树向上旋转)。旋转常见的两种方法为左旋右旋

左旋

在这里插入图片描述

如上图所式,插入99结点之后不再满足二叉平衡树的性质,此时最小失衡子树为以66结点为根的二叉树,对其进行以下左旋操作:

  1. 右孩子代替最小失衡子树根所在的位置(77代替66的位置)
  2. 右孩子的左子树变为原该子树根的右子树(75的父结点改为66,作为右孩子)
  3. 原来的根节点作为新子树根的左孩子(66的父节点改为77,作为左孩子)

在这里插入图片描述

右旋

在这里插入图片描述

如上图所式,插入43结点之后不再满足二叉平衡树的性质,此时最小失衡子树为以66结点为根的二叉树,对其进行以下右旋操作:

  1. 左孩子代替最小失衡子树根所在的位置(60代替66的位置)
  2. 左孩子的右子树变为原该子树根的左子树(63的父结点改为66S,作为左孩子)
  3. 原来的根节点作为新子树根的右孩子(66的父节点改为60,作为右孩子)

在这里插入图片描述

不同破坏平衡方式的调整方式

一般情况下,假设由于在二叉排序树上插入结点而失去平衡的最小子树根结点的指针为A(即A是离插入结点最近,且平衡因子绝对值不超过1的祖先结点),则失去平衡后进行调整的规律可以归纳为一下4种情况:

  1. A左子树根节点的左子树上插入结点而破坏平衡(LL):使用单向右旋平衡方法。
  2. A右子树根节点的右子树上插入结点而破坏平衡(RR):使用单向左旋平衡方法。
  3. A左子树根节点的右子树上插入结点而破坏平衡(LR):使用先左旋后右旋的平衡处理方法。
  4. A右子树根结点的左子树上插入结点而破坏平衡(RL):使用先右旋后左旋的平衡处理方法。

LL

该示例可以看此前失衡调整的右旋。

RR

该示例可以看此前失衡调整的左旋。

LR

在这里插入图片描述

如上图所示,插入65结点之后,不再是二叉平衡,此时再单纯进行右旋不能使树重新平衡,因进行以下操作:

  1. 对失衡节点的左孩子进行左旋操作(60为根进行左旋)
  2. 对失衡节点做右旋操作(66为根进行右旋)

第一步:

在这里插入图片描述

第二步:

在这里插入图片描述

RL

在这里插入图片描述

如上图所示,插入76结点之后,不再是二叉平衡,此时再单纯进行左旋不能使树重新平衡,因进行以下操作:

  1. 对失衡节点的右孩子进行右旋操作。(77为根进行右旋)
  2. 对失衡节点66做左旋操作(66为根进行左旋)

第一步:

在这里插入图片描述

第二步:

在这里插入图片描述

总结

  1. 在所有的不平衡情况中,都是按照先寻找最小不平衡树,然后寻找所属的不平衡类别,再根据4种类别进行固定化程序的操作
  2. 在LR和RL中如果进行第一次旋转之后不论有没有出现新的最小平衡树,下一次调整的还是最初最小平衡树的根节点。

删除操作

这一部分我没有找到很好的文献,希望有知道的同学们推荐一下,下面是我对平衡二叉搜索树删除的理解。有错误可以指出,我修改一下。

上面讲的都是平衡二叉搜索树的插入。而平衡二叉搜索树的删除操作和二叉搜索树的删除一致,都有以下情况:

  1. 如果结点没有孩子结点,则直接删除该结点,并从删除结点的父结点开始检查并调整。
  2. 如果结点只有左子树或者右子树中的一个,则直接将该子树移到被删除结点的位置,并从子树顶结点开始向上检查并调整。
  3. 如果结点拥有两个子树,则用后继或者先驱结点取代被删除的结点,并从后继或者先驱结点的父节点开始检查并调整。

参考文献:

  1. 什么是平衡二叉树(AVL)
  2. JAVA实现平衡二叉树(AVL)——有源码
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值