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;
}

最新文章

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

热门文章

  1. 多实例mysql的安装和管理【验证通过】
  2. docker安装配置
  3. JavaScript(汇聚页)
  4. 如何在WS系统的DOS命令台打印JAVA_HOME变量
  5. 基本项目框架搭建 sqlserver druid配置
  6. PHPStudy环境下搭建composer
  7. dwz+ssh Http status: 200 OK
  8. windows下几个方便的右键菜单
  9. SpringMVC初写(六)静态资源设置
  10. 【ORACLE】Bulk Processing with BULK COLLECT and FORALL