热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

AVL树单选转和双旋转

看了好几天树了,也算有点心得。学树,必须要图。这里有两篇里的博客,在结合书,我用的是《数据结构与算法分析C++版》就可以了。http:blog.csdn.neta454042522

看了好几天树了,也算有点心得。学树,必须要图。这里有两篇里的博客,在结合书,我用的是《数据结构与算法分析C++版》就可以了。

http://blog.csdn.net/a454042522/article/details/8591421


http://blog.csdn.net/vesper305/article/details/13614403

在AVL树中必须平衡的点叫做α,

四种情况:

1.在α左孩子的左子树上插入一个节点,造成不平衡。

2.在α左孩子的右子树上插入一个节点,造成不平衡。书上称为左-右旋转

3.在α右孩子的右子树上插入一个节点,造成不平衡。

4.在α右孩子的左子树上插入一个节点,造成不平衡。书上称为右-左旋转

那么1与3是同一种类型,是对称的,属于单选转。

2与4是同一种类型,是对称的,属于双旋转。

之所以有双旋转,是因为在在α右孩子的左子树上插入一个节点这种情况(右-左旋转),单选转一次是解决不了问题的。(如下图,图复制于第一个博客链接中)

1、首先平衡点是A,A就是α,B是A的右孩子,C是右孩子的左子树。当对C插入后,A不平衡了,条件为A的左子树和右子树之间高度差为2。在图里也就是AL和B之间

高度差为2。

2、左选转一次,是对C与B做左旋转。可以发现A依旧没有平衡。

3、右旋转一次,对C和A做右旋转,以C为新节点树平衡。


谨记:

1、单选转涉及到两个节点,而双旋转涉及到三个节点。这在理解代码方面有用

2、注意每次旋转,节点的子树变化。在双旋转中,因为C要变成根,它的两个子树都要甩给别人,它的左右子树肯定都大于A,但是注意了由于旋转的过程,C的右子树比B小,就甩给B作左子树;C的左子树再甩给A作右子树。

3、双旋转就是先对平衡节点的孙子和儿子出手,在对变成的新儿子的孙子和自己出手。

4、在实际的代码中,传入函数的都是平衡点地址,结束时把新节点的地址赋予就旧平衡点。(我用的是C++)

5、理解这个&*的含义。(我用的是C++),如果单纯传入指针,对树是没有变化的,因为指针进来也只是复制一个指针的副本进行操作。

6、自己首先要能拿手画出来每一步的变化。理解代码时也可以徒手写出每一步的变化。


推荐阅读
  • 本文总结了优化代码可读性的核心原则与技巧,通过合理的变量命名、函数和对象的结构化组织,以及遵循一致性等方法,帮助开发者编写更易读、维护性更高的代码。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 本文探讨了为何相同的HTTP请求在两台不同操作系统(Windows与Ubuntu)的机器上会分别返回200 OK和429 Too Many Requests的状态码。我们将分析代码、环境差异及可能的影响因素。 ... [详细]
  • 本文详细介绍了在 Windows 7 系统中配置 Nginx 1.10.3 和 PHP 7.1.1 NTS 的步骤,包括修改 PHP 配置文件、处理依赖项以及创建批处理脚本启动和停止服务。重点解释了如何解决常见的运行时错误。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 在PHP后端开发中遇到一个难题:通过第三方类文件发送短信功能返回的JSON字符串无法解析。本文将探讨可能的原因并提供解决方案。 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 探讨在PHP开发中,如何选择使用Cookie或数据库来优化网站性能,特别是在处理用户保存的搜索结果时。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 本文详细介绍了如何下载并安装 Python,包括选择合适的版本、执行安装程序以及设置环境变量的步骤。此外,还提供了测试安装是否成功的简单方法。 ... [详细]
  • yikesnews第11期:微软Office两个0day和一个提权0day
    点击阅读原文可点击链接根据法国大选被黑客干扰,发送了带漏洞的文档Trumps_Attack_on_Syria_English.docx而此漏洞与ESET&FireEy ... [详细]
  • HTML基础入门指南
    本文将深入浅出地介绍HTML的基础知识,包括其定义、开发工具、制定机构、特性、基本标签及更多实用内容。 ... [详细]
  • Python包管理工具pip的使用指南
    本文详细介绍了如何使用pip进行Python包的安装、管理和常见问题的解决方法,特别针对国内用户提供了优化建议。 ... [详细]
author-avatar
Kelven
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有