AVL树:平衡的二叉搜索树,其子树也是AVL树。

以下是我实现AVL树的源码(使用了泛型):

import java.util.Comparator;

public class AVLTree<T extends Comparable<T>> {
/*
AVL树:
左右子树高度绝对值最多差1的二叉搜索树
子树也是AVL树
*/
private Node<T> root;
class Node<T extends Comparable<T>>{
T key;
int height;
Node<T> left;
Node<T> right; public Node(T key, int height, Node<T> left, Node<T> right) {
this.key = key;
this.height = height;
this.left = left;
this.right = right;
}
public Node(T key){
this.key = key;
this.height = 0;
}
}
public int getHeight(Node<T> node){
return node == null ? 0 : node.height;
}
public Node<T> LL(Node<T> node){
//左子树插入节点在左导致不平衡,需要旋转,以下不再赘述
Node<T> leftNode = node.left;
node.left = leftNode.right;
leftNode.right = node;
node.height = Math.max(node.left.height,node.right.height) + 1;
leftNode.height = Math.max(leftNode.left.height, leftNode.right.height) + 1;
return leftNode;
}
public Node<T> RR(Node<T> node) {
Node<T> rightNode;
rightNode = node.right;
node.right = rightNode.left;
rightNode.left = node; node.height = Math.max( node.left.height, node.right.height) + 1;
rightNode.height = Math.max( rightNode.left.height, rightNode.right.height) + 1;
return rightNode;
}
public Node<T> LR(Node<T> node){
//LR先对左子树RR再对本树LL
node.left = RR(node.left);
return LL(node);
}
public Node<T> RL(Node<T> node){
node.right = LL(node.right);
return RR(node);
}
public Node<T> insert(Node<T> root,T key){
/*
插入:先判断插入点,再判断是否需要翻转
*/
if(root == null){
return new Node<T>(key);
}
else{
if(key.compareTo(root.key)<0)
//T是实现了comparable接口的,所以这里可以比较,但不能用大小于号
{
root.left = insert(root.left,key);
if(root.left.height - root.right.height == 2){
if (key.compareTo(root.left.key) < 0)
root = LL(root);
else
root = LR(root);
}
}else if(key.compareTo(root.key)>0){
root.right = insert(root.right,key);
if(root.left.height - root.right.height == -2){
if (key.compareTo(root.right.key) < 0)
root = RL(root);
else
root = RR(root);
}
}else{
return root;//相同的节点不添加
}
}
return root;
}
public Node<T> delete(Node<T> root,T key){
/*
删除:找到删除点,判断是否需要翻转
*/
if(root == null || key == null){
return root;
}
else{
if(key.compareTo(root.key)<0)
//T是实现了comparable接口的,所以这里可以比较,但不能用大小于号
{
root.left = delete(root.left,key);
if(root.left.height - root.right.height == -2){
Node<T> rightNode = root.right;
if (rightNode.right.height>root.left.height)
root = RL(root);
else
root = RR(root);
}
}else if(key.compareTo(root.key)>0){
root.right = delete(root.right,key);
if(root.left.height - root.right.height == 2){
Node<T> leftNode = root.left;
if (leftNode.left.height>leftNode.right.height)
root = LL(root);
else
root = LR(root);
}
}else {
//找到了要删除的节点
if (root.left == null) root = root.right;
else if (root.right == null) root = root.left;
else {
if (root.left.height < root.right.height) {
Node<T> tempNode = root.right;
while (tempNode.left != null) {
tempNode = tempNode.left;
}//为保证二叉树的平衡性、搜索性
//这里选择了高度较高的子树,选取中序遍历与root相邻的节点作为root,这样不会破坏搜索性
root.key = tempNode.key;
delete(tempNode, key);
} else {
Node<T> tempNode = root.left;
while (tempNode.right != null) {
tempNode = tempNode.right;
}//为保证二叉树的平衡性、搜索性
//这里选择了高度较高的子树,选取中序遍历与root相邻的节点作为root
root.key = tempNode.key;
delete(tempNode, key);
}
}
}
}
return root;
}
}

AVL树的Java实现的更多相关文章

  1. AVL树之 Java的实现

    AVL树的介绍 AVL树是高度平衡的而二叉树.它的特点是:AVL树中任何节点的两个子树的高度最大差别为1. 上面的两张图片,左边的是AVL树,它的任何节点的两个子树的高度差别都<=1:而右边的不 ...

  2. AVL树的JAVA实现及AVL树的旋转算法

    1,AVL树又称平衡二叉树,它首先是一颗二叉查找树,但在二叉查找树中,某个结点的左右子树高度之差的绝对值可能会超过1,称之为不平衡.而在平衡二叉树中,任何结点的左右子树高度之差的绝对值会小于等于 1. ...

  3. AVL树(三)之 Java的实现

    概要 前面分别介绍了AVL树"C语言版本"和"C++版本",本章介绍AVL树的Java实现版本,它的算法与C语言和C++版本一样.内容包括:1. AVL树的介绍 ...

  4. AVL树(C++&Java)

    目录 AVL Tree精讲专题 前言 一.AVL Tree for CPP(Coding) 1.AVL树原型 2.旋转的四种方式 二.完整版AVL Tree的CPP和JAVA实现 AVL Tree C ...

  5. 数据结构——二叉查找树、AVL树

    二叉查找树:由于二叉查找树建树的过程即为插入的过程,所以其中序遍历一定为升序排列! 插入:直接插入,插入后一定为根节点 查找:直接查找 删除:叶子节点直接删除,有一个孩子的节点删除后将孩子节点接入到父 ...

  6. AVL树原理及实现(C语言实现以及Java语言实现)

    欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. AVL定义 AVL树是一种改进版的搜索二叉树.对于一般的搜索二叉树而言,如果数据恰好 ...

  7. AVL树----java

                                                                                        AVL树----java AVL ...

  8. 【Java】 大话数据结构(12) 查找算法(3) (平衡二叉树(AVL树))

    本文根据<大话数据结构>一书及网络资料,实现了Java版的平衡二叉树(AVL树). 平衡二叉树介绍 在上篇博客中所实现的二叉排序树(二叉搜索树),其查找性能取决于二叉排序树的形状,当二叉排 ...

  9. Java数据结构和算法(七)--AVL树

    在上篇博客中,学习了二分搜索树:Java数据结构和算法(六)--二叉树,但是二分搜索树本身存在一个问题: 如果现在插入的数据为1,2,3,4,5,6,这样有序的数据,或者是逆序 这种情况下的二分搜索树 ...

随机推荐

  1. Servlet中文件上传下载

    1.文件下载: package FileUploadAndDown; import java.io.FileInputStream; import java.io.IOException; impor ...

  2. shiro执行原理

    一.架构 要学习如何使用Shiro必须先从它的架构谈起,作为一款安全框架Shiro的设计相当精妙.Shiro的应用不依赖任何容器,它也可以在JavaSE下使用.但是最常用的环境还是JavaEE.下面以 ...

  3. H2 Database Engine

    http://www.h2database.com/html/main.html H2 Database Engine Welcome to H2, the Java SQL database. Th ...

  4. 入坑C++

    c++中的++来自c语言中的递增运算符,该运算符将变量加1,c++起初也叫c with class ,通过通过名称表面,C++是对c的扩展,因此C++是c语言的超集,这以为这任何有效的c程序都是有效的 ...

  5. cocos2dx-lua 圆角矩形 圆角图片 drawNode

    使用的官方类是:drawNode 函数是:drawNode:drawPolygon() C++函数的参数说明: //画多边形,verts为点集,count为点数,fillColor为填充颜色,bord ...

  6. lua table表判断是否为空

    官方手册里早已经给了答案,那就是靠lua内置的next函数 即如此用: a = {} if next(a) == nil then next其实就是pairs遍历table时用来取下一个内容的函数. ...

  7. 十二.HTTPS网站安全访问实践

    期中集群架构-第十二章-HTTPS安全证书访问连接实践配置========================================= 01:网络安全涉及的问题: ①. 网络安全问题-数据机密性 ...

  8. Win7+keras+tensorflow使用YOLO-v3训练自己的数据集

    一.下载和测试模型 1. 下载YOLO-v3 git clone https://github.com/qqwweee/keras-yolo3.git 这是在Ubuntu里的命令,windows直接去 ...

  9. 关于 永恒之蓝 和 MS17-010 补丁

    [KB4012598]:http://www.catalog.update.microsoft.com/Search.aspx?q=KB4012598 适用于Windows XP 32位/64位/嵌入 ...

  10. 模块度Q

    模块度:也称模块化度量值,是目前常用的一种衡量网络社区结构强度的方法. 常用语衡量一个社区划分结果的优劣:一个理想化的社区划分应该对应着社区内部节点间相似度尽可能的高,同时社区外部节点间的相异度尽可能 ...