初探AVL树

简介: 初探AVL树

树在计算机中是一种非常重要的数据结构,而二叉树是每个节点最多有两个子节点,没有子节点的称为叶节点。今天我想总结一些有关AVL树的相关知识。


AVL tree是一个二叉搜索树,从名字我们就可以看出来,其目的是为了提高二叉排序树的搜索性能,其查找数据的时间复杂度为:O(log n),n为节点个数。


平衡因子:左子树高度-右子树高度

形成一个AVL树有以下条件:

·如果树是AVL树,那么它的左右子树都是AVL树。

·左右子树高度差小于1。


AVL树的插入:

我们把距离插入点最近的不平衡点称为X节点,这时候,有四种情况需要考虑:

1.插入前A节点平衡因子为-1,插入节点在X的左子树中,不影响树的平衡。

2.插入前A节点平衡因子为1,插入节点在X的右子树中,不影响树的平衡。

3.插入前A节点平衡因子为-1,插入节点在X的右子树中,影响树的平衡。

4.入前A节点平衡因子为1,插入节点在X的左子树中,影响树的平衡。


image.png

通常把第3种情况称为R型不平衡,也就是上图中所示的不平衡状态。插入在X节点的右子树的右子树上,称为RR型(如上图所示),插入在X节点的右子树的左子树上,称为RL型。同理第4种情况对应的不平衡有LL型和LR型。


平衡的调整:

对于情况RR和LL我称之为外侧插入,可以使用单旋转方式调整解决。

image.png

当类似图一中的RR型插入,单旋转之后结果:

image.png

当类似图二左图的LL型插入,单旋转之后

image.png

情况LR和RL我称之为内侧插入,可以使用双旋转方式调整解决。

image.png

上图经过一次旋转之后:


image.png

再经过一次旋转之后:

image.png

AVL树的删除:


AVL树的删除操作和插入操作相比较起来,肯定是删除操作比较繁琐复杂一些,因为插入只涉及到插入,而删除首先得确定被删除节点,接下来可能涉及到删除之后的重新调整平衡(插入操作),其实调整平衡的操作相当于又一次的插入过程。


在介绍不平衡状态之前,首先统一下称呼,我们把删除发生在左子树,删除之后平衡因子变为-2的情况,称为L型,对应的右子树删除,平衡因子变为2的情况,我们称之为R型。

可能出现需要调整的不平衡情况(L型与R型对称,此处只说L型):

1.L0型的删除,如下图:

image.png

删除前如上图,此处我们是L型,所以删除值为4的节点。删除调整之后,如下图所示:

image.png

由上图可以看出,L0型的调整实际上是对根节点进行一次左旋调整得到,便得到了平衡的AVL树,R0型相对应的做一次右旋操作。

2.L(-1)型的调整:

image.png

删除前如上图所示,删除值为4的节点,删除之后,出现根节点的平衡因子变为-2的情况,所以进行调整,如下图:

image.png

经过一次左旋之后,节点的平衡因子都变成了0。与L(-1)对应的是R1型,R1型需要做一次右旋,此处不再详述。

3.L1型的删除调整:

image.png

L1型的AVL树,如上图所示,此时我们需要删除节点值为4的节点,值为9的节点处出现了平衡因子值为1,所以称L1型,删除调整:

image.png

删除节点值为4的节点之后,第一次旋转,以值为9的节点进行右旋,如上图所示。接下来进行第二次旋转:

image.png

再进行一次左旋,得到如图AVL树。R(-1)和L1是对称的。

以上有关AVL树的知识点,只是一个小小的原理总结,之后哪天心血来潮的话,在博客上更新一下C语言代码实现。

“鸟欲高飞先振翅,人求上进先读书。”—李苦禅

目录
相关文章
Java 通过IP获取对应的国家省份城市经纬度(离线文件方案)
一. 除了调用接口查询城市, 还可以通过离线文件查询城市, 使用GeoLite2 City库 二. 离线库下载地址: https://dev.maxmind.com/geoip/geoip2/geolite2/ 点击如下位置下载压缩文件 文件解压后有一个文件名为GeoLite2-City.
|
消息中间件 NoSQL JavaScript
阿里官方 Redis 开发规范
阿里官方 Redis 开发规范
|
消息中间件 架构师 Apache
一本书精通Apache RocketMQ
一本书精通Apache RocketMQ
463 3
|
JavaScript Java 数据库
企业微信接入系列-扫码绑定/登录
讲述在企业后台管理平台账号绑定企业微信以及企业微信扫码登录企业管理平台
企业微信接入系列-扫码绑定/登录
|
存储 安全 Java
Java中设计和实现强大的安全认证系统
Java中设计和实现强大的安全认证系统
|
安全 Java Spring
SpringSecurity6从入门到实战之Filter过滤器回顾
该文主要介绍了SpringSecurity框架中的过滤器Filter,探讨了在没有SpringSecurity时如何检查用户登录状态以保护资源。文中通过流程图展示了过滤器在HTTP请求处理中的位置,并提供了官方和中文文档链接。过滤器需实现Filter接口,用于拦截请求并进行预处理和后处理,例如强制登录检查。过滤器链FilterChain则是一系列Filter和资源的组合,通过doFilter方法逐个调用下一个过滤器或传递到目标资源。
|
SQL 存储 数据库
Sql查询原理与Select执行顺序(详细)
原文地址:点击打开链接 一切都是为了性能,一切都是为了业务 一、查询的逻辑执行顺序 (1) FROM left_table (3) join_type JOIN right_table (2) ON join_condition (4) WHERE where_condition (5) GROUP BY group_by_list (6) WITH {cube | rollup} (7
9367 0
|
存储 缓存 安全
通用缓存存储设计实践
通用缓存存储设计实践
5029 3
通用缓存存储设计实践
|
Java 网络安全 API
Java一分钟之-JavaMail:发送电子邮件
本文介绍了使用JavaMail API发送电子邮件的步骤,包括环境准备、依赖引入、基本配置和代码示例。通过添加Maven或Gradle依赖,设置SMTP服务器信息并实现Authenticator,可以创建和发送邮件。同时,文章列举了SMTP认证失败、连接超时等常见问题及其解决方案,并提出了安全与最佳实践建议,如启用SSL/TLS、避免硬编码密码和妥善处理异常。
3511 0
|
SQL Java 关系型数据库
通用分页详细讲解(后端)
通用分页详细讲解(后端)
242 0