[javaSE] 数据结构(AVL树基本概念)
2024-08-26 18:14:35
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;
}
最新文章
- 【腾讯Bugly干货分享】Android动态布局入门及NinePatchChunk解密
- js操作Dom的一些方法简化
- 第16章 调色板管理器_16.4 一个DIB位图库的实现(2)
- SCOI 2013 密码 &; 乱搞
- 【转】MarshalAs属性和使用
- 网站优化之Asp.Net篇<;一>;
- JAVA课程实验报告 实验二 Java面向对象程序设计
- 【HDOJ】【1512】Monkey King
- oracle之spool详细使用总结
- Java反编译器安装及各版本介绍
- python正则表达式基础篇
- error: C2664: “zajiao::zajiao(const zajiao &;)”: 无法将参数 1 从“const char [12]”转换为“char *”
- Struct 和 Union 的详细区别
- 最通俗易懂的javascript变量提升
- C# winform 播放资源中的音频文件
- 如何设置vmware 让别人连接你的虚拟机
- django通用权限控制框架
- elasticsearch基本操作之--使用QueryBuilders进行查询
- [转]AJAX 简介
- CSS个人笔记