定义:一棵AVL树或者是空树,或者是具有下列性质的二叉搜索树:它的左子树和右子树都是AVL树,且左右子树的高度之差的绝对值不超过1

AVL树失衡旋转总结:

假如以T为根的子树失衡、定义平衡因子为 H(left) – H(right) = bf (平衡因子,balance factor),T的左子树为L,右子树为R;

情形1:如果 bf(T) = 2,且bf(L)=1, 执行右旋转,高度减1;

情形2:如果 bf(T) =2 ,且bf(L)= -1, 执行先左后右旋转,高度减1;

情形3:如果 bf(T) =2 ,且bf(L)= 0, 执行右旋转,高度不变,完毕; (这种情形只有删除时会遇到)

情形4:如果bf(T) =-2,且bf(R) =-1, 执行左旋转,高度减1;

情形5:如果bf(T)=-2, 且bf(R)=1, 执行先右后左旋转,高度减1;

情形6:如果 bf(T) =-2,且bf(R)= 0,执行左旋转,高度不变,完毕;(这种情形只有删除时会遇到)

在插入时,高度减1,不用向上递归;删除时需要向上递归

AVL树旋转之插入旋转

设插入一个节点后,最下层的某棵子树不再平衡,设该子树的根节点为T,则

如果新插入节点在T的左子树的左子树上,则执行右旋转,情形1;

如果新插入的节点在T的右子树的右子树上,则执行左旋转,情形4;

如果新插入的节点在T的左子树的右子树上,则执行先左后右旋转,情形2;

如果心插入的节点在T的右子树的左子树上,则执行先右后左旋转,情形5;

插入旋转后不会改变该棵子树的高度,因此不用向上层递归;

如果一个插入操作没有导致失衡,则插入操作可能会也可能不会增加数的高度

如果一个插入操作导致失衡,则插入前的高度和插入失衡旋转后的高度相等,因此插入旋转不用向上递归

定理:在插入过程中,由平衡状态到失衡状态,树的高度必然加1;由失衡到平衡状态,树的高度必然减1;

定理:构建AVL树时,导致高度增加的那次插入操作必然不会导致失衡;导致失衡的那次插入旋转操作,必然使树的高度先加1(插入),在减1(旋转)从而使树的高度不变;

AVL树旋转之删除旋转

要删除节点为T,父节点为P,子节点为S;

如果T没有孩子节点,即左右子树为空,直接删除,P指向T的指针设为NULL,,向上更新平衡因子,若有失衡按情形调整

如果T只有一个孩子S, 将P指向T的指针指向S,向上更新平衡因子,如果失衡按情形调整

如果T有两个孩子,选择后继节点q(也可以选择前驱),用q替换T,接下来删除q,q的左子树一定为空,右子树可能为空也可能不为,此时将q的父节点指向q的指针指向q的右子树,向上更新平衡因子,如果失衡按情形旋转。

性能分析:设N(h)为高度为h的AVL树的最小节点数目,则N(h)=N(h-1) + N(h-2) +1; N(0)=0, N(1)=1; 类似斐波那契数列; 插入、查找和删除的性能均为log(n)

AVL树总结的更多相关文章

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

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

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

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

  3. AVL树

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

  4. AVL树的平衡算法(JAVA实现)

      1.概念: AVL树本质上还是一个二叉搜索树,不过比二叉搜索树多了一个平衡条件:每个节点的左右子树的高度差不大于1. 二叉树的应用是为了弥补链表的查询效率问题,但是极端情况下,二叉搜索树会无限接近 ...

  5. 【数据结构】平衡二叉树—AVL树

    (百度百科)在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增 ...

  6. 数据结构图文解析之:AVL树详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  7. 数据结构之平衡二叉树(AVL树)

    平衡二叉树(AVL树)定义如下:平衡二叉树或者是一棵空树,或者是具有以下性质的二叉排序树: (1)它的左子树和右子树的高度之差绝对值不超过1: (2)它的左子树和右子树都是平衡二叉树. AVL树避免了 ...

  8. PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由

    03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...

  9. 论AVL树与红黑树

    首先讲解一下AVL树: 例如,我们要输入这样一串数字,10,9,8,7,15,20这样一串数字来建立AVL树 1,首先输入10,得到一个根结点10 2,然后输入9, 得到10这个根结点一个左孩子结点9 ...

  10. (4) 二叉平衡树, AVL树

    1.为什么要有平衡二叉树? 上一节我们讲了一般的二叉查找树, 其期望深度为O(log2n), 其各操作的时间复杂度O(log2n)同时也是由此决定的.但是在某些情况下(如在插入的序列是有序的时候), ...

随机推荐

  1. 新生代内存中为什么要有两个survivor区

    首先是关于新生代中的内存分布的描述: 新生代中的对象都是“朝生夕死”的对象,所以每次gc存活的对象很少,于是在新生代中采用的垃圾回收算法是“复制算法”. 将新生代的内存分为一块较大的Eden区域和两块 ...

  2. Redis特点

    内存存储,速度极快. 支持的数据类型多,相比较其他的Nosql. 键:字符串 值的六种数据结构:字符串,列表,散列,集合,有序集合,HyperLogLog 附加功能强大

  3. watir-webdriver使用过程中异常

    1.在jruby版本1.6.7中,报异常:not such file to load --watir-webdriver 解决方法 :在文件的首行添加:require 'rubygems'       ...

  4. CentOS远程监控

    近日,因工作需要,学习了CentOS远程监控的水平有限,多指教. 远程访问CentOS,包括三种方式ssh,telnet,vnc. 本例涉及的是以vnc远程访问CentOS.指令在root下操作.注意 ...

  5. vue2.0:(三)、项目开始,首页入门(main.js,App.vue,importfrom)

    接下来,就需要对main.js App.vue 等进行操作了. 但是这就出现了一个问题:什么是main.js,他主要干什么用的?App.vue又是干什么用的?main.js 里面的import fro ...

  6. MySQL常用函数使用示例

    #从指定字符中,随机生成12位字符select substring('0123456789abcdefghijklmnopqrstuvwxyz',floor(0+RAND()*36),12); #显示 ...

  7. SQL 数学串函数

    数学函数 ceiling  取上限 floor  取下限 round 四舍五入 len   长度 abs  绝对值 PI()圆周率 sqrt 开根号 qwuare 平方根 select  10     ...

  8. ubuntu 14.04 配置java 1.8环境变量

    从官网上下载jdk 源文件,并解压 root@hett-PowerEdge-T30:/usr/local/src# tar -xzvf jdk-8u151-linux-x64.tar.gz 解压完成之 ...

  9. CPP-基础:关于多态

        类的多态特性是支持面向对象的语言最主要的特性,有过非面向对象语言开发经历的人,通常对这一章节的内容会觉得不习惯,因为很多人错误的认为,支持类的封装的语言就是支持面向对象的,其实不然,Visua ...

  10. CPP-基础:关于引用

    1.什么是“引用”?申明和使用“引用”要注意哪些问题? 引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同. 申明一个引用的时候,切记要对其进行初始化. 引用声明完 ...