一、AVL树简介

AVL树是一种平衡的二叉查找树。

平衡二叉树(AVL 树)是
一棵空树,或者
是具有下列性质的二叉排序树:
    1它的左子树和右子树都是平衡二叉树,
    2且左子树和右子树高度之差的绝对值不超过 1。

定义平衡因子(BF)为该结点左子树的高度减去右子树的高度所得的高度差;AVL 树任一结点平衡因子只能取-1,0,1;

二、AVL树插入

插入:先查找被插入元素,如果存在,则不操作;如果不存在,则插入。

插入后就是调整和选择的问题。

我们先看一下我们会面临怎么样的问题:

离插入点最近的失衡点可能很近,

也可能很远,所以我们要以下面这种模型思考。

可能的旋转有四种

1 LL型

2 LR型

3 RR型

4 RL型

为什么会只有这四种情况

无非是

失衡点BF=2,左节点BF=1,LL;

失衡点BF=2,左节点BF=-1,LR;

失衡点BF=-2,右节点BF=-1,RR;

失衡点BF=-2,右节点BF=1,RL;

所以写程序时,只要找到失衡点,根据BF就能判断该执行哪种旋转。

还有点就是如何计算BF,程序的参考http://blog.sina.com.cn/s/blog_6c014ac00100l35o.html

三、AVL树删除

一般查找二叉树删除节点

删除的方案有很多,但一般都会旋转下面这种,因为对整棵树各个分支深度的影响较小。

a.当被删除节点n是叶子节点,直接删除

b.当被删除节点n只有一个孩子,删除n,用孩子替代该节点的位置

c.当被删除结点n存在左右孩子时,真正的删除点应该是n的中序遍在前驱,或者说是左子树最大的节点,之后n的值替换为真正删除点的值。这就把c归结为a,b的问题。

有了上面的规则,再结合http://www.cnblogs.com/Clingingboy/archive/2010/10/09/1846865.html即可

参考文章

http://blog.csdn.net/gabriel1026/article/details/6311339

http://blog.sina.com.cn/s/blog_6c014ac00100l35o.html

http://www.cnblogs.com/Clingingboy/archive/2010/10/09/1846865.html

AVL树插入和删除的更多相关文章

  1. B树——插入和删除

    B树--插入和删除 B树的插入 5阶B数--结点关键字个数向上取整m/2-1≤n≤m-1 即2≤n≤4 连续插入5个元素后,超出来了. 在插入key后,若导致原结点关键字数超过上限,则从中间位置(m/ ...

  2. 二叉平衡树AVL的插入与删除(java实现)

    二叉平衡树 全图基础解释参考链接:http://btechsmartclass.com/data_structures/avl-trees.html 二叉平衡树:https://www.cnblogs ...

  3. AVL树插入操作实现

    为了提高二插排序树的性能,规定树中的每个节点的左子树和右子树高度差的绝对值不能大于1.为了满足上面的要求需要在插入完成后对树进行调整.下面介绍各个调整方式. 右单旋转 如下图所示,节点A的平衡因子(左 ...

  4. AVL树插入(Python实现)

    建立AVL树 class AVLNode(object): def __init__(self,data): self.data = data self.lchild = None self.rchi ...

  5. HDU 5687 字典树插入查找删除

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5687 2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解 #include< ...

  6. AVL树的插入与删除

    AVL 树要在插入和删除结点后保持平衡,旋转操作必不可少.关键是理解什么时候应该左旋.右旋和双旋.在Youtube上看到一位老师的视频对这个概念讲解得非常清楚,再结合算法书和网络的博文,记录如下. 1 ...

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

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

  8. 二叉树之AVL树的平衡实现(递归与非递归)

    这篇文章用来复习AVL的平衡操作,分别会介绍其旋转操作的递归与非递归实现,但是最终带有插入示例的版本会以递归呈现. 下面这张图绘制了需要旋转操作的8种情况.(我要给做这张图的兄弟一个赞)后面会给出这八 ...

  9. 深入浅出数据结构C语言版(12)——平衡二叉查找树之AVL树

    在上一篇博文中我们提到了,如果对普通二叉查找树进行随机的插入.删除,很可能导致树的严重不平衡 所以这一次,我们就来介绍一种最老的.可以实现左右子树"平衡效果"的树(或者说算法),即 ...

随机推荐

  1. 用ueditor上传图片、文件等到七牛云存储

    ueditor上传文件,是用数据流的形式上传的. 而七牛云存储官方文档中,只提供了文件路径上传的方式. 但是,仅仅是在官方文档中写了这一种方式. 事实上,利用VS的对象管理器,打开Qiniu的dll, ...

  2. 为什么class中属性以空格分隔?

    1 div.contain .blue{color:blue;}/*后代选择器*/2 div.contain.blue{color:blue;} /*多类选择器*/ 以上两种规则分别应用的元素如下: ...

  3. FileStream 操作文件复制

    static void Main(string[] args) { string source = @"D:\c\集合.avi"; string target = @"C ...

  4. (五)JS学习笔记 - Sizzle选择器

    Sizzle词法解析 sizzle对于分组过滤处理都用正则,其中都有一个特点,就是都是元字符^开头,限制匹配的初始,所以tokenize也是从左边开始一层一层的剥离. •可能会应用到正则如下: // ...

  5. POJ3641 Pseudoprime numbers(快速幂+素数判断)

    POJ3641 Pseudoprime numbers p是Pseudoprime numbers的条件: p是合数,(p^a)%p=a;所以首先要进行素数判断,再快速幂. 此题是大白P122 Car ...

  6. 3月25日 javascript练习

    1.找出100以内带7的数字 2.求1!+2!+3!+......+n!的和

  7. twemproxy 安装

    twemproxy 安装 1. 获取安装包 shell> wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz shell> ...

  8. php对象中类的继承性访问类型控制

    类型的访问控制通过使用修饰符允许开发人员对类中成员的访问进行限制.这是PHP5的新特性,也是OOP语言中的重要特性,大多数OOP语言都已支持此特性.PHP5支持如下三种访问修饰符,在类的封装中我们已经 ...

  9. Android退出程序

    public class ExitApplication extends Application { private static ExitApplication instance ; List< ...

  10. Android 网络通信框架Volley的简单使用

    Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮. Volley提供的功能: JSON,图像等的异步下载: 网络请求的排序(scheduling) 网络请求的优先级处理 ...