再回首数据结构—AVL树(二)
前面主要介绍了AVL的基本概念与结构,下面开始详细介绍AVL的实现细节;
AVL树实现的关键点
AVL树与二叉搜索树结构类似,但又有些细微的区别,从上面AVL树的介绍我们知道它需要维护其左右节点平衡,实现AVL树关键在于标注节点高度、计算平衡因子、维护左右子树平衡这三点,下面分别介绍;
标注节点高度
从上面AVL树的定义中我们知道AVL树其左右节点高度差不能超过一,所以我们需要标注出每个节点高度;

1、节点高度为最大的子节点高度加1,其中叶子节点高度为1;
2、1与4叶子节点高度为1,节点3高度为节点4的高度加1,节点2高度为1与3节点中最大的高度加1;
3、节点初始化时高度为1,当在AVL中添加与删除节点时需要维护其节点高度,在AVL添加节点后需要重新计算当前添加节点的高度;
计算平衡因子
标注了每个节点高度后此时可以轻松算出每个节点的平衡因子,只需其节点左子树与右子树的高度差的绝对值即可;

1、1、4叶子节:平衡因子为0
2、节点3:右子树高度为1,左子树其高度为0,0-1绝对值为1,此节点平衡因子为1
3、节点2:左子树高度为1,右子树高度为2,1-2绝对值为1,此节点平衡因子为1
维护左右子树平衡
当在AVL中添加与删除节点时都可能造成AVL变成失去平衡状态使之退化为二叉搜索树,AVL中主要在添加节点与删除节点时需要维护其左右子树的平衡因子;
添加节点
添加节点最终都是添加到叶子节点上,节点添加后其先祖节点可能出现了失去平衡的情况,需要从添加的节点开始向上维护平衡性,向上查找不平衡节点;
右旋转
新增节点在不平衡节点左侧的左侧,同时不平衡节点左子树高度大于等于右子树高度(左子树平衡因子大于等于右子树平衡因子);

添加节点1后第一个不平衡节点为节点3,同时节点3左子树高度大于右子树高度,此时需要不平衡节点向右旋转;

通过如下操作完成节点右旋转;
T = 2.right
2.right = 3
3.left = T
左旋转
新增节点在不平衡节点右侧的右侧,同时不平衡节点右子树高度大于等于左子树高度(右子树平衡因子大于等于左子树平衡因子);

添加节点3后,节点1失去平衡 添加节点3后第一个不平衡节点为节点1,同时节点1右子树高度大于左子树高度,此时需要不平衡节点向左旋转;

通过如下操作完成节点左旋转;
T = 2.left
2.left = 1
1.right = T
先左旋转后右旋转
新增节点在不平衡节点左侧的右侧

先左旋转,变成了右旋转问题,重复上面说所的右旋转;

T = 4.left
Y = T.right
Z = Y.left
Y.left = T
T.right = Z
4.left = Y
先右旋转后左旋转
新增节点在不平衡节点右侧的左侧

先右旋转,变成了左旋转问题,重复上面说所的左旋转;

T = 2.right
Y = T.left
Z = Y.right
Y.right = T
T.left = Z
2.right = Y
删除节点
删除节点是AVL树也可能会失去平衡,因此也需要维护AVL的平衡性;
节点的删除右这么几个步骤:
1、 要删除的节点比当前节点小时在左子树查找
2、 要删除的节点比当前节点大时在右子树查找
3、 要删除节点为当前节点且左子树为空时右子树顶上
4、 要删除节点为当前节点且右子树为空时左子树顶上
5、 要删除节点左右子树均存在时,大于当前节点的最小节点顶上
6、 更新节点高度值
7、 计算节点平衡因子
8、 进行与添加节点时一样的平衡因子维护操作
文章首发地址:Solinx
http://www.solinx.co/archives/1330
再回首数据结构—AVL树(二)的更多相关文章
- 再回首数据结构—AVL树(一)
前面所讲的二叉搜索树有个比较严重致命的问题就是极端情况下当数据以排序好的顺序创建搜索树此时二叉搜索树将退化为链表结构因此性能也大幅度下降,因此为了解决此问题我们下面要介绍的与二叉搜索树非常类似的结构就 ...
- AVL树(二)之 C++的实现
概要 上一章通过C语言实现了AVL树,本章将介绍AVL树的C++版本,算法与C语言版本的一样. 目录 1. AVL树的介绍2. AVL树的C++实现3. AVL树的C++测试程序 转载请注明出处:ht ...
- 第三十二篇 玩转数据结构——AVL树(AVL Tree)
1.. 平衡二叉树 平衡二叉树要求,对于任意一个节点,左子树和右子树的高度差不能超过1. 平衡二叉树的高度和节点数量之间的关系也是O(logn) 为二叉树标注节点高度并计算平衡因子 AVL ...
- AVL树(二叉平衡树)详解与实现
AVL树概念 前面学习二叉查找树和二叉树的各种遍历,但是其查找效率不稳定(斜树),而二叉平衡树的用途更多.查找相比稳定很多.(欢迎关注数据结构专栏) AVL树是带有平衡条件的二叉查找树.这个平衡条件必 ...
- 数据结构-AVL树的旋转
http://blog.csdn.net/GabrieL1026/article/details/6311339 平衡二叉树在进行插入操作的时候可能出现不平衡的情况,AVL树即是一种自平衡的二叉树,它 ...
- JAVA数据结构--AVL树的实现
AVL树的定义 在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度都是.增 ...
- 数据结构--Avl树的创建,插入的递归版本和非递归版本,删除等操作
AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树. 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值最多为1(空树的高度为-1). 也就是说,AVL树,本质上 ...
- Java数据结构——AVL树
AVL树(平衡二叉树)定义 AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,并且拥有自平衡机制.在AV ...
- 简单数据结构———AVL树
C - 万恶的二叉树 Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:32768KB 64b ...
随机推荐
- root无权限删除 原因 进程 占用 文件
[root@test opt]# find / | grep gitlab | xargs rm -rfrm: cannot remove ‘/sys/fs/cgroup/devices/system ...
- Dynamic Web Module to 3.0 报错
一.问题 使用maven项目创建的webapp项目Dynamic Web Module 默认是2.3. 当我们要切换到3.0的时候出现这个错误. 二.解决 1.点击进入Navigator view ( ...
- @GetMapping和@PostMapping接收参数的格式
一.1.使用@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面 若返回json等内容到页面,则需要加@ResponseBody注解 ...
- zoom:1
zoom这个特性是IE特有的属性. zoom:1;一般是拿来解决IE6的子元素浮动时候父元素不随着自动扩大的问题,功能相当于overflow:auto,同样也可以用height:1%来代替zoom ...
- ubuntu下安装android模拟器genymotion【转】
本文转载自:http://www.jianshu.com/p/e6062ebb8fc9 去genymotion下载对应的安装包genymotion-2.4.0_x64.bin sudo ./genym ...
- POJ2492 A Bug's Life —— 种类并查集
题目链接:http://poj.org/problem?id=2492 A Bug's Life Time Limit: 10000MS Memory Limit: 65536K Total Su ...
- java HttpClient GET请求
HttpClient GET请求小实例,先简单记录下. package com.httpclientget; import java.io.IOException; import org.apache ...
- 基于BASYS2的VHDL程序——数字钟(改进版)
扩展到时分秒.加了入调时电路,但不知道为什么有两个按键不好使.而且不知道以何种方式假如按键消抖电路,因为加入后会多个时钟控制一个信号,物理不可实现.调试电路待解决.还有,四个数目管中间的那两个圆点怎么 ...
- zabbix 中 宏 的介绍
宏的作用是便于在模板.items.trigger中的引用.宏的名称为 {$名称},宏的字符范围为 A~Z.0~9._ . 例如: 在key中的宏: net.tcp.service[ssh,{$SSH_ ...
- BZOJ 1632 [Usaco2007 Feb]Lilypad Pond:spfa【同时更新:经过边的数量最小】【路径数量】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1632 题意: 有一个n*m的池塘.0代表水,1代表荷花,2代表岩石,3代表起点,4代表终点 ...