[javaSE] 数据结构(AVL树基本概念)
AVL树是高度平衡的二叉树,任何节点的两个子树的高度差别<=1
实现AVL树
定义一个AVL树,AVLTree,定义AVLTree的节点内部类AVLNode,节点包含以下特性:
1.key——关键字,对AVL树的节点进行排序
2.left——左子树
3.right——右子树
4.height——高度
如果在AVL树插入节点后可能导致AVL树失去平衡,具体会有四种状态:
LL:左左,LeftLeft
LR:左右,LeftRight
RL:右左,RightLeft
RR:右右,RightRight
解决上面的情况
解决LL,需要左单旋转
解决RR,需要右单旋转
解决LR,需要先右单旋转,再左单旋转
解决RL,需要先左单旋转,再右单旋转
实现左单旋转

k1,k2
k2的left给k1
k1的right给k2的left
k2给k1的right
实现右单旋转
k1,k2
k1的right给k2
k2的left给k1的right
k1给k2的left

节点的高度,是它左子树或者右子树中,高度大的那个 再加1
/**
* AVL树测试
* @author taoshihan
* @param <T>
*
*/
public class AVLTree<T extends Comparable<T>> {
private AVLNode mRoot;//根节点
class AVLNode<T extends Comparable<T>>{
private T key;//键值
private int height;//高度
private AVLNode left;//左子树
private AVLNode right;//右子树
public AVLNode(T key,AVLNode left,AVLNode right) {
this.key=key;
this.left=left;
this.right=right;
this.height=0;
}
}
/**
* 获取节点高度
* @param tree
* @return
*/
public int height(AVLNode<T> tree){
if(tree!=null){
return tree.height;
}
return 0;
}
/**
* 取出左右子树中高的那个
* @param a
* @param b
* @return
*/
public int maxHeight(int a,int b){
return a>b ? a : b;
}
/**
* 左单旋转
* @param k2
* @return
*/
public AVLNode<T> leftLeftRotation(AVLNode<T> k2){
AVLNode k1;
k1 = k2.left;
k2.left=k1.right;
k1.right=k2;
k2.height=maxHeight(height(k2.left), height(k2.right));
k1.height=maxHeight(height(k1.left), height(k1.right));
return k1;
}
/**
* 右单旋转
* @param k2
* @return
*/
public AVLNode<T> rightRightRotation(AVLNode<T> k1){
AVLNode k2;
k2=k1.right;
k1.right=k2.left;
k2.left=k1; k2.height=maxHeight(height(k2.left), height(k2.right));
k1.height=maxHeight(height(k1.left), height(k1.right));
return k2;
}
[javaSE] 数据结构(AVL树基本概念)的更多相关文章
- 再回首数据结构—AVL树(二)
前面主要介绍了AVL的基本概念与结构,下面开始详细介绍AVL的实现细节: AVL树实现的关键点 AVL树与二叉搜索树结构类似,但又有些细微的区别,从上面AVL树的介绍我们知道它需要维护其左右节点平衡, ...
- 数据结构 - AVL 树
简介 基本概念 AVL 树是最早被发明的自平衡的二叉查找树,在 AVL 树中,任意结点的两个子树的高度最大差别为 1,所以它也被称为高度平衡树,其本质仍然是一颗二叉查找树. 结合二叉查找树,AVL 树 ...
- 数据结构-AVL树的旋转
http://blog.csdn.net/GabrieL1026/article/details/6311339 平衡二叉树在进行插入操作的时候可能出现不平衡的情况,AVL树即是一种自平衡的二叉树,它 ...
- 简单数据结构———AVL树
C - 万恶的二叉树 Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:32768KB 64b ...
- JAVA数据结构--AVL树的实现
AVL树的定义 在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度都是.增 ...
- 数据结构--Avl树的创建,插入的递归版本和非递归版本,删除等操作
AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树. 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值最多为1(空树的高度为-1). 也就是说,AVL树,本质上 ...
- 再回首数据结构—AVL树(一)
前面所讲的二叉搜索树有个比较严重致命的问题就是极端情况下当数据以排序好的顺序创建搜索树此时二叉搜索树将退化为链表结构因此性能也大幅度下降,因此为了解决此问题我们下面要介绍的与二叉搜索树非常类似的结构就 ...
- 第三十二篇 玩转数据结构——AVL树(AVL Tree)
1.. 平衡二叉树 平衡二叉树要求,对于任意一个节点,左子树和右子树的高度差不能超过1. 平衡二叉树的高度和节点数量之间的关系也是O(logn) 为二叉树标注节点高度并计算平衡因子 AVL ...
- Java数据结构——AVL树
AVL树(平衡二叉树)定义 AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,并且拥有自平衡机制.在AV ...
随机推荐
- linux网络流量实时监控工具之iptraf 【个人比较喜欢用的流量监控软件】
linux网络流量实时监控工具之iptraf IPTraf是一个网络监控工具,功能比nload更强大,可以监控所有的流量,IP流量,按协议分的流量,还可以设置过滤器等,如下图 对监控网络来说,这个更适 ...
- web负载均衡【总结归纳所有看过的资料的理论】
web负载均衡 在有些时候进行扩展是显而易见的,比如下载服务由于带宽不足而必须进行的扩展,但是,另一些时候,很多人一看到站点性能不尽如人意,就马上实施负载均衡等扩展手段,真的需要这样做吗?当然这个问题 ...
- SpringMvc-ModelAndView 结果出不来 显示路径问题 解决办法
今天写SpringMVC的时候 写ModelAndView的时候 死活跳不过页面去-一直报错 显示路径也错误 查看导包问题 应该: import org.springframework.web.se ...
- HTTP报文语法/HTTP组成
一.HTTP报文分类:请求报文和响应报文 请求报文会向Web服务器请求一个动作,响应报文会将请求的结果返回给客户端 请求报文格式: <method> <request-UR ...
- php脚本cli 模式运行
参考文章 http://rapheal.sinaapp.com/2013/11/20/php_zend_hello_world/ http://www.douban.com/note/33788568 ...
- 关于类的成员,public,private修饰符
类的成员要:属性,方法 属性:是它本身所居有的东西,比如人的特征,也可以这样理解属性是静态状态 方法:是这些属性通过方法行为发生改变,也就是方法是动态,可以对属性进行更新 public 公共的,可以被 ...
- PlistBuddy简单使用
PlistBuddy简单使用 由于PlistBuddy并不在Mac默认的Path里,所以我们得通过绝对路径来引用这个工具: 查看帮助 /usr/libexec/PlistBuddy --help 下面 ...
- L03-Linux RHEL6.5系统中配置本地yum源
1.将iso镜像文件上传到linux系统.注意要将文件放在合适的目录下,因为后面机器重启时还要自动挂载,所以此次挂载成功之后该文件也不要删除. 2.将iso光盘挂载到/mnt/iso目录下. (1)先 ...
- fd与FILE结构体
文件描述符 fd 概念:文件描述符在形式上是一个非负整数.实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表.当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件 ...
- [BZOJ5248][2018九省联考]一双木棋
题目描述 https://www.lydsy.com/JudgeOnline/problem.php?id=5248 Solution 我们首先考虑放棋子的操作 发现它一定放棋子的部分是一个联通块 ...