一、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. C#程序调用cmd执行命令(转)

    C#通过程序来调用cmd命令的操作 string str = Console.ReadLine(); System.Diagnostics.Process p = new System.Diagnos ...

  2. WPF资源字典使用

    资源字典出现的初衷就在于可以实现多个项目之间的共享资源,资源字典只是一个简单的XAML文档,该文档除了存储希望使用的资源之外,不做任何其它的事情. 1.  创建资源字典 创建资源字典的过程比较简单,只 ...

  3. C# - CSV(Comma-Separated Values)文件读取.

    using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using Sys ...

  4. Linux_x64安装Oracle11g(完整版)

    一.修改操作系统核心参数 在Root用户下执行以下步骤: 1)修改用户的SHELL的限制,修改/etc/security/limits.conf文件 输入命令:vi /etc/security/lim ...

  5. xml bug

    在Eclipse 创建动态WEB 工程,在src 下 创建 config.xml: 1 <?xml version="1.0" encoding="UTF-8&qu ...

  6. Vim光标移动

    最近全面转换开发到Mac OS下,用MacVim作为IDE.记录一些Vim基本操作给自己备忘. 此次所说的都是在common-mode(c-mode,在Vim又名normal-mode,就是刚进入vi ...

  7. Tomcat目录下的各个文件夹的作用

    1.bin:存放各种不同平台开启与关闭Tomcat的脚本文件. 2.lib:存tomcat与web应用的Jar包 3.conf:存放tomcat的配置文件 4.webapps:web应用的发布目录,包 ...

  8. Lintcode--001(比较字符串)

    比较两个字符串A和B,确定A中是否包含B中所有的字符.字符串A和B中的字符都是 大写字母 注意事项 在 A 中出现的 B 字符串里的字符不需要连续或者有序. 您在真实的面试中是否遇到过这个题? Yes ...

  9. PYTHON线程知识再研习B

    使用threading.Thread模块,也有两种使用方法,可以用类,也可以在实例化对象中传入函数或类实例. #!/usr/bin/env python # -*- coding: utf-8 -*- ...

  10. LeetCode_Swap Nodes in Pairs

    Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2-& ...