Java实现Avl树
Avl树即左右子树的深度【高度】相差不可超过1,所以在插入key的时候,就会出现需要旋转【更改根节点】的操作
下面是源代码:
/*
the define of avltree's node
*/
class MyNode {
int key, height;
MyNode left, right; MyNode(int d) {
key = d;
height = 1;
}
} public class MyAvlTree {
MyNode root; /*
the function of get_tree_height
*/
int getHeight(MyNode node) {
if (node == null)
return 0;
return node.height;
} /*
the function of get the max of two numbers
*/
int max(int a, int b) {
return (a > b) ? a : b;
} /*
the function of right rotate subtree rooted y
*/
MyNode rightRoate(MyNode y) {
MyNode x = y.left;
MyNode t = x.right; /*
perform rotation
*/
x.right = y;
y.left = t; /*
update the heights
*/
y.height = max(getHeight(y.left), getHeight(y.right)) + 1;
x.height = max(getHeight(x.left), getHeight(x.right)) + 1;
// return new root
return x;
} /*
the function of left rotate subtree rooted x
*/
MyNode leftRoate(MyNode x) {
MyNode y = x.right;
MyNode t = y.left; /*
perform rotation
*/
y.left = x;
x.right = t; /*
update the heights
*/
x.height = max(getHeight(x.left), getHeight(x.right));
y.height = max(getHeight(y.left), getHeight(y.right));
//return new root
return x;
} /*
get balance factor of node n
*/
int getBalance(MyNode node) {
if (node == null)
return 0;
return getHeight(node.left) - getHeight(node.right);
} /*
the function of insert
*/
MyNode insertKey(MyNode n, int key) {
if (n == null)
return (new MyNode(key));
if (key > n.key)
n.right = insertKey(n.right, key);
else if (key < n.key)
n.left = insertKey(n.left, key);
else
return n; /*
update height
*/
n.height = 1 + max(getHeight(n.left), getHeight(n.right)); //get balance
int balance = getBalance(n); /*
there are four cases
*/
//left-left case
if (balance > 1 && key < n.left.key)
return rightRoate(n);
//right-right case
if (balance > 1 && key > n.right.key)
return leftRoate(n);
//left-right case
if (balance > 1 && key > n.left.key) {
n.left = leftRoate(n.left);
return rightRoate(n);
}
//right-left case
if (balance > 1 && key < n.right.key) {
n.right = rightRoate(n.right);
return leftRoate(n);
}
return n;
} /*
the functionn of preOrder
*/
void preOrder(MyNode node) {
if (node != null) {
System.out.print(node.key + " ");
preOrder(node.left);
preOrder(node.right);
}
} /*
the test example
*/
public static void main(String[] args) {
MyAvlTree tree = new MyAvlTree(); //the test
tree.root = tree.insertKey(tree.root, 10);
tree.root = tree.insertKey(tree.root, 20);
tree.root = tree.insertKey(tree.root, 30);
tree.root = tree.insertKey(tree.root, 40);
tree.root = tree.insertKey(tree.root, 50);
tree.root = tree.insertKey(tree.root, 25); System.out.println("Preorder traversal" +
" of constructed tree is : ");
tree.preOrder(tree.root);
}
}
Java实现Avl树的更多相关文章
- Java数据结构——AVL树
AVL树(平衡二叉树)定义 AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,并且拥有自平衡机制.在AV ...
- JAVA数据结构--AVL树的实现
AVL树的定义 在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度都是.增 ...
- AVL树(三)之 Java的实现
概要 前面分别介绍了AVL树"C语言版本"和"C++版本",本章介绍AVL树的Java实现版本,它的算法与C语言和C++版本一样.内容包括:1. AVL树的介绍 ...
- AVL树原理及实现(C语言实现以及Java语言实现)
欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. AVL定义 AVL树是一种改进版的搜索二叉树.对于一般的搜索二叉树而言,如果数据恰好 ...
- AVL树----java
AVL树----java AVL ...
- AVL树之 Java的实现
AVL树的介绍 AVL树是高度平衡的而二叉树.它的特点是:AVL树中任何节点的两个子树的高度最大差别为1. 上面的两张图片,左边的是AVL树,它的任何节点的两个子树的高度差别都<=1:而右边的不 ...
- AVL树的Java实现
AVL树:平衡的二叉搜索树,其子树也是AVL树. 以下是我实现AVL树的源码(使用了泛型): import java.util.Comparator; public class AVLTree< ...
- AVL树的JAVA实现及AVL树的旋转算法
1,AVL树又称平衡二叉树,它首先是一颗二叉查找树,但在二叉查找树中,某个结点的左右子树高度之差的绝对值可能会超过1,称之为不平衡.而在平衡二叉树中,任何结点的左右子树高度之差的绝对值会小于等于 1. ...
- 【Java】 大话数据结构(12) 查找算法(3) (平衡二叉树(AVL树))
本文根据<大话数据结构>一书及网络资料,实现了Java版的平衡二叉树(AVL树). 平衡二叉树介绍 在上篇博客中所实现的二叉排序树(二叉搜索树),其查找性能取决于二叉排序树的形状,当二叉排 ...
随机推荐
- Arm启动流程解析
谈到arm的启动流程不得不说的是bootloader,但是我这篇文章主要来谈谈arm启动流程的,所以bootloader只是跟大家简介一下就ok.这篇文章我会谈到以下内容: 1.bootloader简 ...
- 视频会议20方100点 v2.66.1.18
平台: Windows 类型: 虚拟机镜像 软件包: 视频会议服务器( Video Conference Server ) 20-party video conference business int ...
- jquery.dad.js实现table的垂直拖拽(并取到当前拖拽对象)
http://sc.chinaz.com/jiaoben/161202572210.htm 1.首先官网实例,实现的都是div为容器的元素拖拽,示例如下: 2.最近的项目,要实现tbody的每一行tr ...
- iOS获取/删除url中的参数
1.获取URL中的某个参数: - (NSString *)getParameter:(NSString *)parameter urlStr:(NSString *)url { NSError *er ...
- ABI and ISA
ABI定义了如何使用ISA. ISA定义了机器码的使用规则. http://www.delorie.com/gnu/docs/gmp/gmp_6.html ABI and ISA ABI (Appli ...
- Buffer实例
互联网的基础是数据的传送,一切都围绕着数据展开,比如发送啊,接收啊,这一切都离不开网络,通过之前,学会了通过http模块来搭建一个服务器,也实现了网络爬虫,nodejs中网络的部分,Net这个模块,对 ...
- 文本编辑器Vim技巧
1. 导入文件内容 :r 文件名 2. 插入当前日期 :r !date 3. :!which ls 4. :r !命令
- Android Realm初试
Realm is a mobile database that runs directly inside phones, tablets or wearables. This repository h ...
- Oracle 使用Nid 修改数据库的DBID 和 Database Name
How to Change the DBID, DBNAME Using NID Utility (Doc ID 863800.1) Changing the DBID and Database Na ...
- 使用nsis开发自定义安装包使用心得,以及遇到坑
因为新公司需要开发pc应用的自定义安装包,开始时候计划使用nsis开发,论坛上面有很多不错的例子,而且完成度很强, 随便拿来修改使用,但是后续的开发过程中遇到的问题就逐个出现. 首先说一下nsis的优 ...