AVL树是最早发明的自平衡二叉搜索树之一。

平衡因子(Balance Factor):某结点的左右子树的高度差

AVL树的特点

  • 每个结点的平衡因子只可能是1,0,-1(绝对值<=1,如果超过,称之为“失衡”)
  • 每个结点的左右子树高度差不超过1
  • 搜索,添加,删除的时间复杂度是O(logn)

添加导致的失衡

最坏情况:可能会导致所有祖先结点都失衡,父节点,非祖先结点,都不可能失衡。

如何解决添加导致的失衡?

旋转有LL-右旋转(单旋) RR-左旋转(单旋) LR-RR左旋转,LL右旋转(双旋) RL-LL右旋转,RR左旋转(双旋),可以通过旋转解决具体的添加失衡

LL-右旋转(单旋)

如图n为某个结点,p为n的父节点,g为n的祖父结点,T0,T1是n的子树且高度相等,T2是p的右子树,与左子树n的高度相等,T3是g的右子树,比左子树p的高度少1。(图画的不太好,莫笑!!!)

现在在T0子树下添加一个结点如下图,发现g结点失去平衡,n和p结点没有失去平衡。g结点的平衡因子变成2。

可以通过右旋转恢复平衡,右旋转后仍是一颗二叉搜索树:T0<n<T1<p<T2<g<T3,且树的高度没有改变,整棵树达到平衡。

g.left=p.right
p.right=g//让p成为这颗子树的根结点

注意:还需要维护T2,p,g的parent属性,先后更新g,p的高度。

RR-左旋转(单旋)

如下图,T2子树和T3子树高度相等,T1子树和n子树高度相等,T0子树比p子树高度大1。

现在往T3子树下添加一结点,如下图(图画的确实不好看),g的平衡因子变成-2。

可以通过左旋转来恢复平衡,左旋转后仍然是一颗二叉搜索树:T0<n<T1<p<T2<g<T3,且树的高度没有改变,整棵树达到平衡。

g.right=p.left
p.left=g//让p成为这颗子树的根结点


这里需要注意维护T1,p,g的parent属性,先后更新g,p的高度。

画图太累了,我就不画了,LR(双旋)和RL双旋也是依赖前面两个单旋的基础上的,比较简单,这里不在叙述。

AVL树(LL,RR,LR,RL)相关推荐

  1. 【数据结构笔记12】平衡二叉树,AVL树,RR旋转/LL旋转/LR旋转/RL旋转,AVL树插入的代码实现

    本次笔记内容: 4.2.1 什么是平衡二叉树 4.2.2 平衡二叉树的调整 文章目录 什么是平衡二叉树 评价查找长度ASL 平衡因子(Balance Factor,BF) 平衡二叉树(Balanced ...

  2. AVL树、splay树(伸展树)和红黑树比较

    AVL树.splay树(伸展树)和红黑树比较 一.AVL树: 优点:查找.插入和删除,最坏复杂度均为O(logN).实现操作简单 如过是随机插入或者删除,其理论上可以得到O(logN)的复杂度,但是实 ...

  3. AVL树(二)之 C++的实现

    AVL树(二)之 C++的实现 概要 上一章通过C语言实现了AVL树,本章将介绍AVL树的C++版本,算法与C语言版本的一样. 目录 1. AVL树的介绍 2. AVL树的C++实现 转载请注明出处: ...

  4. AVL树(一)之 C语言的实现

    概要 本章介绍AVL树.和前面介绍"二叉查找树"的流程一样,本章先对AVL树的理论知识进行简单介绍,然后给出C语言的实现.本篇实现的二叉查找树是C语言版的,后面章节再分别给出C++ ...

  5. 2021- 10 -13 AVL树的平衡调整(有parent指针) 代码逻辑

    AVL平衡调整步骤: 代码写的十分潦草而且没经过测试,看个乐,我认为应该重点看一下没有parent指针的版本,以及我认为这里重点在于理解过程. 插入结点 找到 插入节点的 的第一个 不平衡的 非父祖先 ...

  6. 2021-10-11 ! AVL树 及其平衡调整 四种情况 恋上数据结构笔记 (考过)

    b站有个up讲的很详细 https://www.bilibili.com/video/BV1xE411h7dd?from=search&seid=11383601726930144190&am ...

  7. 构造avl树_浅谈AVL树,B-树,B+树

    B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的.在讲B ...

  8. AVL树(艾薇儿树)

    接上章:二叉搜索树(Binary Search Tree). 通过二叉搜索树的学习,我们发现,二叉搜索树节点的添加和删除都是随机的,这里就会产生一种特殊情况,如下图所示: 001.jpg 此种情况,是 ...

  9. 数据结构:AVL树的平衡调整——LL,LR,RL,RR

    AVL树的全称是平衡搜索二叉树,本质上也是一个二叉搜索树(BST),满足BST树的所有性质. 但是我们在使用二叉搜索树的时候,我们知道通常情况在BST中搜索一个节点的时间复杂度是O(lgn). 最坏的 ...

最新文章

  1. 读书笔记-我所理解的生活
  2. MongoDB numa系列问题一:[initandlisten] connection refused because too many open connections:
  3. Java split拆分使用竖线为分隔符的字符串方法
  4. FreeMarker缓存处理
  5. java从键盘上录入任何整数,输出该整数的阶乘
  6. Mysql的int和bigint字段类型,映射到Java的Integer和Long类型时,勾选UNSIGNED无符号会导致越界转换。
  7. dragstart drag dragend dragenter dragover dragleave drop
  8. 天猫魔盘在ubuntu16.04中的使用
  9. Idea的JShell Console
  10. 51单片机c语言脉冲计数实验报告,单片机计数器实验报告.doc
  11. 关于计算机网络以下说法哪个正确().,青书学堂: (多选题) 关于计算机网络,以下说法哪个正确?( )(本题4.0分)...
  12. Recording︱有价值的各类AI、机器学习比赛心得、经验抄录
  13. Java生成四种格式的二维码
  14. python对mysql增删改查+计算器+九九乘法表
  15. 聚合搜索V2.0泛解析泛目录站群二开源码 可做指定关键词SEO源码
  16. html网页比赛演讲稿,故事大王比赛的演讲稿范文(精选5篇)
  17. 毕业1年半,我从月薪3000变成百万粉丝博主 | 附野生运营技巧
  18. JavaSE基础(79) BigInteger(能够存取比Long更大的整数,可以任意大小)
  19. MySQL DBlink
  20. kafka命令之消费者组

热门文章

  1. 网络通信OSI七层或五层模型,路由协议(OSPF,IGRP等)
  2. 确定项目的目的和目标
  3. 2015.11--360校招面试-后台C++开发工程师
  4. c++通讯录管理系统(函数,指针,结构体)
  5. 阿里云进入Iot Studio
  6. LeetCode08 有效的数独
  7. oracle语句调试,Oracle中使用fnd_log_messages调试的步骤
  8. 腾讯微信客服电话怎么直接人工服务呢
  9. 未来教育二级mysql怎么做题_计算机二级买了未来教育,但是不知道该怎么学习,就是单纯的刷题吗?感觉没有书有点不习惯,怎么办?...
  10. 官方文件出炉!北京住建委权威解读商住限购