AVL树即平衡二叉树,每个结点有一个平衡因子,即左子树高度减去右子树高。每插入一个结点时,从根部开始按二叉排序树的方法,与节点不断比较,按大小向左右子树插入。在与最后的节点比较后插入时,若有兄弟节点,说明树的高度没有变,此时依然平衡;若没有,则小范围内树高改变了,需回溯,依次更改祖先的平衡因子,若遇到有平衡因子失衡,则,调整,使其与插入之前高度一致,以保证平衡,若未失衡,且平衡因子不变,说明该子树高度未变,停止回溯。

  简而言之就是插入后从底开始看有没有影响树高,小树高可能影响大树高,若无波澜则不变,若有波澜则看是否失衡,失衡调整结束,仅仅只是波澜则继续向上看波澜,平衡因子的值发生变化说明有波澜。

  对于删除,按照二叉排序树的删除方式调整,分为两种三种情况,没有子树和只有一个子树,有两个子树。由平衡二叉树的性质容易知道:没有子树即叶子节点,只有一个子树即叶子节点的父节点,两个子树即其它祖先节点。只有一个子树的情况用子节点替代后删除子节点,两个子树用右子树的最左端的节点替代后删除(即中序遍历的首值、最大值),之后该值用右子树替代,等于两个晋升替代,由于最大值只有右子树,所以其右子树只能为叶子或为空,为空时最大值即为叶子,不为空则为叶子的父节点。三种方法都可以将删除的节点替代为叶子节点。所以与插入相似,归纳为从被删除的该结点开始调整祖先平衡因子,遇到波澜向上看波澜,判断是否要调整,若无波澜结束。

  调整就是两种(四种)情况,相关解释很多。插入时有LL(RR),LR(RL);删除时也可归纳为LL与LR,L代表左高,删除时的两种情况是LL的左边被删,树高减一,该结节因子为0;LR右边被删,树高不变,因子变为2;LR好办,只需调整该结节即可,调整完因子不变,可停止。而LL则需不断回溯,看波澜,最后也可视为一个LL。

  更新:删除节点时可以直接用子树节点替代,若有两个子节点高度相等,则随便选一个节点替代,树高度不变。若有一个高一个低,则拿高的替代,树高减一,回溯。回溯需要保存三个节点指针,以判断是LL还是LR。

关于AVL树的思考的更多相关文章

  1. AVL树插入和删除

    一.AVL树简介 AVL树是一种平衡的二叉查找树. 平衡二叉树(AVL 树)是一棵空树,或者是具有下列性质的二叉排序树:    1它的左子树和右子树都是平衡二叉树,    2且左子树和右子树高度之差的 ...

  2. 树的平衡之AVL树——错过文末你会后悔,信我

    学习数据结构应该是一个循序渐进的过程: 当我们学习数组时,我们要体会数组的优点:仅仅通过下标就可以访问我们要找的元素(便于查找). 此时,我们思考:假如我要在第一个元素前插入一个新元素?采用数组需要挪 ...

  3. AVL树原理及实现 +B树

    1. AVL定义 AVL树是一种改进版的搜索二叉树.对于一般的搜索二叉树而言,如果数据恰好是按照从小到大的顺序或者从大到小的顺序插入的,那么搜索二叉树就对退化成链表,这个时候查找,插入和删除的时间都会 ...

  4. 树-二叉搜索树-AVL树

    树-二叉搜索树-AVL树 树 树的基本概念 节点的度:节点的儿子数 树的度:Max{节点的度} 节点的高度:节点到各叶节点的最大路径长度 树的高度:根节点的高度 节点的深度(层数):根节点到该节点的路 ...

  5. AVL树(二叉平衡树)详解与实现

    AVL树概念 前面学习二叉查找树和二叉树的各种遍历,但是其查找效率不稳定(斜树),而二叉平衡树的用途更多.查找相比稳定很多.(欢迎关注数据结构专栏) AVL树是带有平衡条件的二叉查找树.这个平衡条件必 ...

  6. python常用算法(5)——树,二叉树与AVL树

    1,树 树是一种非常重要的非线性数据结构,直观的看,它是数据元素(在树中称为节点)按分支关系组织起来的结构,很像自然界中树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形 ...

  7. 算法与数据结构(十一) 平衡二叉树(AVL树)

    今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...

  8. AVL树原理及实现(C语言实现以及Java语言实现)

    欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. AVL定义 AVL树是一种改进版的搜索二叉树.对于一般的搜索二叉树而言,如果数据恰好 ...

  9. AVL树

    AVL树 在二叉查找树(BST)中,频繁的插入操作可能会让树的性能发生退化,因此,需要加入一些平衡操作,使树的高度达到理想的O(logn),这就是AVL树出现的背景.注意,AVL树的起名来源于两个发明 ...

随机推荐

  1. Kong(V1.0.2) Securing the Admin API

    Introduction Kong的Admin API为Services, Routes, Plugins, Consumers, and Credentials的管理和配置提供了一个RESTful接 ...

  2. 窗口置顶 - 仿TopWind

    前置学习:低级鼠标hook,获得鼠标状态. 这个在原来获得鼠标状态的基础上,加上一个事件处理即可. TopWind就是一个可以置顶窗口的文件,避免复制粘贴的时候的来回切换(大窗口与小窗口),算是一个实 ...

  3. 聊一聊isinstance与type

    聊一聊isinstance与type 最近写代码的时候遇到了一个关于isinstance与type的坑,这里给大家分享下,如果大家也遇到了同样的问题,希望本文能为大家解决疑惑把. isinstance ...

  4. servlet-response学习笔记

    为了给用户一个返回数据,我们需要使用HttpServletResponse 从相应对象获取一个输入流 通过输入流将返回结果写入到响应体中 关闭输入流 public class ResponseServ ...

  5. [译] iOS 11.4.1 Beta:全新的USB限制模式

    (Source/原文链接 https://blog.elcomsoft.com/2018/06/ios-11-4-1-beta-usb-restricted-mode-has-arrived/) 作者 ...

  6. maven教程全攻略

    maven教程全攻略 我们在开发项目的过程中,会使用一些开源框架.第三方的工具等等,这些都是以jar包的方式被项目所引用,并且有些jar包还会依赖其他的jar包,我们同样需要添加到项目中,所有这些相关 ...

  7. ntp服务

    ntp服务主要是用于对计算机的时间同步管理操作.时间是对服务器来说是很重要的,一般很多网站都需要读取服务器时间来记录相关信息,如果时间不准,则可能造成很大的影响,对于集群,也需要时间同步. 部署安装N ...

  8. SQL JOIN 中 on 与 where 的区别

    left join : 左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join : 右连接,返回右表中所有的记录以及左表中连接字段相等的记录. inner join : 内连 ...

  9. python之数据类型详解

    python之数据类型详解 二.列表list  (可以存储多个值)(列表内数字不需要加引号) sort s1=[','!'] # s1.sort() # print(s1) -->['!', ' ...

  10. sql脚本过大,无法打开的解决方法

    打开cmd命令窗口,输入如下命令: sqlcmd -S ipaddress -U user -P password -d dbname -i file 其中,ipaddress是数据库服务器ip,us ...