平衡树、AVL树
平衡树
平衡树有AVL树、红黑树、2-3树、2-3-4树
AVL树
AVL树是最早的一种平衡树,它以发明者的名字命名;AVL是一种特殊的二叉搜索树,平移保证二叉搜索树的正确。
特征
在AVL树中节点的左子树和右子树的高度差不会大于1
实现
在AVL树中每个节点都存储着一个额外的数据,它的左子树和右子树的高度差,这个差值不能大于1。
插入一个元素后,检查该元素所在的最低子树的根,如果它的子节点的高度相差大于1,执行一次或两次旋转使它们的高度相等;然后接着检查上面的节点,必要时均衡高度;这个检测一直向上,直到根为止。
旋转
右旋,顶端节点必须有一个左子节点,否则将没有节点代替原来的顶端节点;反之亦然。只要一个节点的左边有很多子孙节点而右边没有这么多节点,右旋;反之亦然。
1、单旋转——右旋1

a图是一个正确的AVL树,节点50的右子树高度为0,左子树的高度为1,差值不大于1
b图插入一个节点30后,整个树不平衡了。右旋,以节点50为顶端节点做右旋,节点50下降,节点40上升,节点30跟随着上升
c图是旋转后的样子
2、单旋转——右旋2

a图是一个正确的AVL树,节点50的右子树高度为1,左子树的高度为2,差值不大于1
b图插入一个节点5后,整个树不平衡了。右旋,以节点50为顶端节点做右旋,节点50下降,节点70跟随着下降;节点20上升,节点10、节点5跟随着上升;但节点30要平移
c图是旋转后的样子
注意:顶端节点的内侧子孙要做平移。如果顶端节点的内侧子孙是一颗树,旋转不会改变该子树中节点的关系,整体跟着平移就好了。
3、双旋转——左-右双旋转

a图是一个正确的AVL树,节点50的右子树高度为0,左子树的高度为1,差值不大于1
b图插入一个节点30后,整个树不平衡了。
c假如对b图做右旋,以节点50为顶端节点做右旋,节点50下降;节点20上升;但节点30要平移——这样就产生了c图,但c图还是不平衡,所以不能这么做
d正确的做法是,对b图以节点20做为顶端节点先做一次左旋,这次左旋后的样子如d图,还不平衡;
e再右旋,以节点50为顶端节点做右旋,结果如e图

a图是一个正确的AVL树,节点50的右子树高度为1,左子树的高度为2,差值不大于1
b图插入一个节点25后,整个树不平衡了。先左旋,以节点20为顶端节点做左旋,节点20下降,节点10跟随着下降;节点30上升;但节点25要平移
c图是第一次左旋后的样子,还不平衡;再右旋,以节点50为顶端节点做右旋
d图是旋转好的样子
注意:当新节点添加到内侧时,要做两次旋转;当新节点添加到了外侧时,只做一次旋转即可,如右旋1和右旋2
旋转总结
左-右双旋转举了两个例子。以上三种旋转包含了所有的旋转,只是对应的还有左旋、左旋2、右-左双旋转。
效率
AVL树的层数最多是Log2(N+1)+1,查找时间最差需要Log2(N+1)+1次比较,大约O(logN)。
插入或删除也大约需要O(logN)的时间。插入或删除一个节点时需要扫描两趟,一次向下查找插入点,一次向上平衡树,所以不如红黑树效率高。
平衡树、AVL树的更多相关文章
- (4) 二叉平衡树, AVL树
1.为什么要有平衡二叉树? 上一节我们讲了一般的二叉查找树, 其期望深度为O(log2n), 其各操作的时间复杂度O(log2n)同时也是由此决定的.但是在某些情况下(如在插入的序列是有序的时候), ...
- java项目---用java实现二叉平衡树(AVL树)并打印结果(详)(3星)
package Demo; public class AVLtree { private Node root; //首先定义根节点 private static class Node{ //定义Nod ...
- 二叉查找树,AVL树,伸展树【CH4601普通平衡树】
最近数据结构刚好看到了伸展树,在想这个东西有什么应用,于是顺便学习一下. 二叉查找树(BST),对于树上的任意一个节点,节点的左子树上的关键字都小于这个节点的关键字,节点的右子树上的关键字都大于这个节 ...
- 平衡树以及AVL树
平衡树是计算机科学中的一类数据结构. 平衡树是计算机科学中的一类改进的二叉查找树.一般的二叉查找树的查询复杂度是跟目标结点到树根的距离(即深度)有关,因此当结点的深度普遍较大时,查询的均摊复杂度会上升 ...
- Python与数据结构[3] -> 树/Tree[2] -> AVL 平衡树和树旋转的 Python 实现
AVL 平衡树和树旋转 目录 AVL平衡二叉树 树旋转 代码实现 1 AVL平衡二叉树 AVL(Adelson-Velskii & Landis)树是一种带有平衡条件的二叉树,一棵AVL树其实 ...
- AVL树(二叉平衡树)详解与实现
AVL树概念 前面学习二叉查找树和二叉树的各种遍历,但是其查找效率不稳定(斜树),而二叉平衡树的用途更多.查找相比稳定很多.(欢迎关注数据结构专栏) AVL树是带有平衡条件的二叉查找树.这个平衡条件必 ...
- 从零开始学算法---二叉平衡树(AVL树)
先来了解一些基本概念: 1)什么是二叉平衡树? 之前我们了解过二叉查找树,我们说通常来讲, 对于一棵有n个节点的二叉查找树,查询一个节点的时间复杂度为log以2为底的N的对数. 通常来讲是这样的, 但 ...
- 树-二叉平衡树AVL
基本概念 AVL树:树中任何节点的两个子树的高度最大差别为1. AVL树的查找.插入和删除在平均和最坏情况下都是O(logn). AVL实现 AVL树的节点包括的几个组成对象: (01) key -- ...
- 【数据结构06】二叉平衡树(AVL树)
目录 一.平衡二叉树定义 二.这货还是不是平衡二叉树? 三.平衡因子 四.如何保持平衡二叉树平衡? 五.平衡二叉树插入节点的四种情况 六.平衡二叉树操作的代码实现 七.AVL树总结 @ 一.平衡二叉树 ...
随机推荐
- Deep Learning (中文版&英文版)
Bengio Yoshua,Ian J. Goodfellow 和 Aaron Courville共同撰写的<深度学习>(Deep Learning)是一本为了帮助学生及从业者入门机器学习 ...
- MySQL笔记(5)---索引与算法
1.前言 本章记录MySQL中的索引机制,了解索引可以让数据库更快.索引太多会造成性能损耗,索引太少肯定查询效率不高. 2.InnoDB存储引擎所有概述 InnoDB中常见的索引有: B+树索引 全文 ...
- CentOS 部署 Python3 的一些注意事项
环境:centos6.7https://github.com/vinta/awesome-pythonhttps://github.com/PyMySQL/PyMySQLhttps://github. ...
- 12 二叉树-链式存储-二叉排序树(BST)
呜呜 写这个东西花了我2天 居然花了两天!!我还要写AVL呢啊啊啊啊啊啊啊!!!!!! 等下还要跑去上自习 大早上起来脸都没洗现在先赶紧发博客 昨晚写出来了独自在其他人都睡着了的宿舍狂喜乱舞.. 迷之 ...
- Linux MBR扇区误删恢复
目录 1. 引导记录误删恢复 1.1 备份引导记录 1.2 误删引导记录 1.3 恢复引导记录 2. 分区表误删恢复 2.1 备份分区表 2.2 误删分区表 2.3 恢复分区表 如果MBR分区表没了, ...
- Django+Echarts画图实例
所有演示均基于Django2.0 阅读此篇文章你可以: 了解Django中aggregate和annotate函数的使用方法 获取一个Django+Echarts绘制柱状图的完整示例 需求说明 一张会 ...
- tomcat 的自问自答与总结
目录 1 tomcat 的加载问题,启动后更新是否自动加载 2 tomcat 的context.xml 文件读取顺序与覆盖原则 3 就是 建议的tomcat 配置 4 避免二次部署加载的问题 在查看了 ...
- Linux配置多个Tomcat同时运行
Linux系统下怎样配置多个Tomcat同时运行呢,首先修改变量为第一个tomcat,然后修改第二个tomcat启动的脚本 1.修改环境变量 # vi /etc/profile ####### 工程1 ...
- postgresql 导出和导入数据库
使用 pg_dump 和 pg_restore 来备份和还原 postgresql的数据: 导出:pg_dump导入:pg_restore 最简单的导出命令如下:(导出指定数据库) $ pg_dump ...
- double转换为int以及浮点型相加损失精度问题
最近在做支付相关模块的业务,数据库字段却使用的是double类型,其实也行,只要计算不在sql语句中进行,也是没有问题的. 预先的类属性设置的是Double类型,自己算的时候发现小数相加会出现损失精度 ...