AVL树的Java实现
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实现的更多相关文章
- AVL树之 Java的实现
AVL树的介绍 AVL树是高度平衡的而二叉树.它的特点是:AVL树中任何节点的两个子树的高度最大差别为1. 上面的两张图片,左边的是AVL树,它的任何节点的两个子树的高度差别都<=1:而右边的不 ...
- AVL树的JAVA实现及AVL树的旋转算法
1,AVL树又称平衡二叉树,它首先是一颗二叉查找树,但在二叉查找树中,某个结点的左右子树高度之差的绝对值可能会超过1,称之为不平衡.而在平衡二叉树中,任何结点的左右子树高度之差的绝对值会小于等于 1. ...
- AVL树(三)之 Java的实现
概要 前面分别介绍了AVL树"C语言版本"和"C++版本",本章介绍AVL树的Java实现版本,它的算法与C语言和C++版本一样.内容包括:1. AVL树的介绍 ...
- AVL树(C++&Java)
目录 AVL Tree精讲专题 前言 一.AVL Tree for CPP(Coding) 1.AVL树原型 2.旋转的四种方式 二.完整版AVL Tree的CPP和JAVA实现 AVL Tree C ...
- 数据结构——二叉查找树、AVL树
二叉查找树:由于二叉查找树建树的过程即为插入的过程,所以其中序遍历一定为升序排列! 插入:直接插入,插入后一定为根节点 查找:直接查找 删除:叶子节点直接删除,有一个孩子的节点删除后将孩子节点接入到父 ...
- AVL树原理及实现(C语言实现以及Java语言实现)
欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. AVL定义 AVL树是一种改进版的搜索二叉树.对于一般的搜索二叉树而言,如果数据恰好 ...
- AVL树----java
AVL树----java AVL ...
- 【Java】 大话数据结构(12) 查找算法(3) (平衡二叉树(AVL树))
本文根据<大话数据结构>一书及网络资料,实现了Java版的平衡二叉树(AVL树). 平衡二叉树介绍 在上篇博客中所实现的二叉排序树(二叉搜索树),其查找性能取决于二叉排序树的形状,当二叉排 ...
- Java数据结构和算法(七)--AVL树
在上篇博客中,学习了二分搜索树:Java数据结构和算法(六)--二叉树,但是二分搜索树本身存在一个问题: 如果现在插入的数据为1,2,3,4,5,6,这样有序的数据,或者是逆序 这种情况下的二分搜索树 ...
随机推荐
- mysql-8.0.11安装步骤
1.下载好安装包:mysql-8.0.11-winx64.zip 2.解压到合适的目录,例如:C:\XQ\Soft\mysql-8.0.11-winx64 3.在目录下创建my.ini文件,配置bas ...
- php7 + 新特性 部分
三目运算符: 以前:$type = isset($_GET['type']) ? $_GET['type'] : '测试'; php7.0: $type = $_GET['type'] ?? '测试' ...
- 文本框监听事件blur()的简单使用
场景描述:在做编辑功能的时候,经常要判断编码,或者密码之类的是否已经被使用,以前自己做的时候,经常都是在提交了之后才判断的,到现在,才发现,这样做的用户体验不好,完美一点的做法就是当此文本框失去焦点的 ...
- 深入理解 Java 垃圾回收机制
深入理解 Java 垃圾回收机制 一:垃圾回收机制的意义 java 语言中一个显著的特点就是引入了java回收机制,是c++程序员最头疼的内存管理的问题迎刃而解,它使得java程序员 ...
- spring Boot异步操作报错误: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.self.spring.springboot.Jeep' available
我也是最近开始学习Spring Boot,在执行异步操作的时候总是汇报如下的错误: Exception in thread "main" org.springframework.b ...
- thinkphp5调用阿里大鱼短信
:在Controller.php public function send() { if (request()->isPost()) { $phone = input('post.phone/s ...
- CSS3标准盒模型还是IE怪异模型box-sizing属性的应用设置
在一个文档中,每个元素都被表示为一个矩形的盒子.盒子模型具有4个属性['外边距(margin)','边框(border)','内边距(padding)','内容(content)']. 我们要设置某个 ...
- 【C#】多态
public class Animal { public virtual void Eat() { Console.WriteLine("Animal eat"); Console ...
- python 几个简单算法详解
一.冒泡排序 基本思想:它的思路很有特点循环,两两向后比较.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数 ...
- 网页布局之flex
Flex是Flexible Box的缩写,意为“弹性布局”,用来为盒状模型提供最大的灵活性.设为Flex布局以后,子元素的float.clear和vertical-align属性将失效.使用flex ...