[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 ...
随机推荐
- python--中的文件操作
1.文件操作 把文件打开 open 打开 f = open ('文件路径',mode='模式',encoding='编码格式') #打开一个文件操作的时候取到的是一个句柄 读取的方法 . read() ...
- c++实验5 顺序/链式队列
链式队列及循环队列 1.循环队列的实现(请采用模板类及模板函数实现) [实现提示] 同时可参见教材p65-p67页的ADT描述及算法实现及ppt)函数.类名称等可自定义,部分变量请加上学号后3位.也可 ...
- JAVA日期——java.util.date类的操作
package com.hxzy.time; import java.text.SimpleDateFormat;import java.util.Date; public class DateDem ...
- 调用jdbc已经写成的方法----jdbc工具类抽取方式二
先创建db.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/web08?useUnicode=true& ...
- leetcode-217-Contains Duplicate(使用排序来判断整个数组有没有重复元素)
题目描述: Given an array of integers, find if the array contains any duplicates. Your function should re ...
- 架构师养成记--23.sigar使用实例
作用是检测机器的硬件环境 注意在jdk的bin目录下加上sigar的lib目录中的文件 import java.net.InetAddress; import java.net.UnknownHost ...
- Learn to See in the Dark(论文阅读笔记)
最近做项目看了一篇论文<Learn to See in the Dark>下面是一些论文笔记 概括: 这篇论文主要介绍的是在低光照的环境下用两个标准的FCN网络,通过控制变量法来对比不同的 ...
- maven 打包 war 包含 WEB-INF/lib 目录
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactI ...
- P2486 [SDOI2011]染色(树剖)区间覆盖+区间的连续段
https://www.luogu.org/problemnew/show/P2486 值的一看https://www.cnblogs.com/Tony-Double-Sky/p/9283262.ht ...
- dubbo学习笔记:快速搭建
搭建一个简单的dubbo服务 参考地址: dubbo官网:http://dubbo.apache.org/zh-cn/docs/user/references/registry/zookeeper.h ...