当前位置: 首页 > news >正文

告别死记硬背!图解AVL树的四种旋转,代码实现也不难

前言

在《一文彻底掌握二叉查找树,非史上最全总结(多图,附代码)》我们讲了二叉查找树,在文章的最后我们也提到了,二叉查找树查找的效率受到树的深度的影响,最坏情况是O(N)。而二叉查找树的深度是根据数据插入的顺序不同而表现出不同的。那么有没有可能让树的深度尽可能低,从而提高我们查询的效率呢?答案就是今天要讲的平衡二叉树(AVL树)。

定义

AVL树是二叉查找树的一个特例,所以上一篇文章说到的二叉查找树的定义是AVL树定义的前提。在这个前提之下,AVL树再提出了写更加严格的定义。那就是,树的任意节点的子树的高度差都小于等于1。

树的操作

由于AVL树比普通的二叉查找树有个更加苛刻的要求,要求子树的高度差小于等于1。那么在树的插入、删除等操作时将会比普通的二叉查找树更加麻烦。

插入

AVL树插入的第一步其实跟二叉查找树一样,但是插入数据后,可能会导致树失去平衡,那么这时就需要对子树进行旋转了。通过选择来使得树继续保持平衡。

树失去平衡会有四种情况:

  1. 节点的左儿子的左子树插入节点,导致左子树比右子树高(LL),如下图树插入节点1之后,6的左子树高度比右子树高2。

  2. 节点的右儿子的右子树插入节点,导致右子树比左子树高(RR)

  3. 节点的左儿子的右子树插入节点,导致左子树比右子树高(LR)

  4. 节点的右儿子的左子树插入节点,导致左子树比右子树高(RL)

AVL树失去平衡之后,可以通过旋转使其恢复平衡。四种失去平衡的情况下对应的旋转方法分别如下:

LL的旋转,步骤如下:

  1. 将根节点的左孩子作为新根节点。

  2. 将新根节点的右孩子作为原根节点的左孩子。

  3. 将原根节点作为新根节点的右孩子。

伪代码:

// 要旋转的节点为node,其父节点是parent Node temp = node.left; node.left = temp.right; temp.right = node; parent.left = temp;

LL 旋转示意图如下:

http://www.jsqmd.com/news/483879/

相关文章:

  • 【Python入门实战】一周吃透基础语法!
  • 终极指南:如何用《每日等效香烟》App直观了解城市空气污染
  • 编译器扩展与C++兼容性
  • 探索无限智能:`analysis-pinyin` - 汉字拼音分析利器
  • conda建立keras和pytorch环境
  • 软考高项:第22章:组织通用治理(占分分析/考点/题)
  • JavaScript性能优化实战翱拱
  • 探索Damn Vulnerable Defi Foundry:打造DeFi安全专家之路
  • 动态规划(dp)——完全背包题目
  • C++与Rust交互编程
  • 南大通用(GBase 8s)数据库在 Spring Boot 中使用 Flyway 和 Flowable
  • CN_GreenLumaGUI 项目推荐
  • 探索《最佳数据科学资源》项目:一站式学习与进阶宝典
  • 模板编译期计算
  • 常用windows命令【端口-进程查询、查询包含某个字符串的文件】
  • 如何快速掌握 Skylark in Go:灵活强大的配置语言与脚本引擎全指南
  • Spring Aop失效的情況及解决办法
  • WebLaF高级特性详解:动画效果、自定义皮肤与响应式设计
  • 10个创意案例:用react-nice-avatar打造独特用户头像系统
  • 如何在Windows上测试ip和端口
  • 2026年比较好的碱液屏蔽泵品牌推荐:液冷屏蔽泵用户口碑认可厂家 - 行业平台推荐
  • CN_GreenLumaGUI 项目常见问题解决方案
  • 如何用gh_mirrors/ta/tagger快速实现专业级命名实体识别?3步上手教程
  • Mybatis二级缓存
  • e3nn高级教程:如何自定义具有欧几里得对称性的神经网络层
  • 2026年质量好的自吸式屏蔽泵厂家推荐:氟化氢屏蔽泵/氯甲烷屏蔽泵/管道循环屏蔽泵厂家信誉综合参考 - 品牌宣传支持者
  • 10个Biostar Central项目常见问题的终极解决方案
  • 终极KeyDB社区生态指南:如何成为高效贡献者并掌握沟通技巧
  • 基于PLC变速恒频风电控制系统设计
  • go-mail与主流SMTP服务集成:Gmail、Outlook和SendGrid配置示例