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树). 平衡二叉树介绍 在上篇博客中所实现的二叉排序树(二叉搜索树),其查找性能取决于二叉排序树的形状,当二叉排 ...
随机推荐
- Orcal笔记3-DDL-DML
一.Oracle的支持数据类型 1.字符串类型 char 固定长度(定义时即已确定长度,空余位置被补全),最大长度255,如 name char(10),'中'会占用10个长 ...
- (二)JavaScript之[函数]与[作用域]
3].函数 /** * 事件驱动函数. * 函数执行可重复使用的代码 * * 1.带参的函数 * 2.带返回值的函数 * 3.局部变量 * * 4.全局变量 * 在函数外的:不用var声明,未声明直接 ...
- tomcat启动部署APP报错:This is very likely to create a memory leak
This is very likely to create a memory leak的错误,网上很多,原因也是各种各样,这里也仅提供一个解决的思路. 问题描述:启动tomcat时,不能访问部署的AP ...
- javaWeb上移下移(SpringMVC+Mabits+MySql)
文章已移至:https://blog.csdn.net/baidu_35468322/article/details/79643356 移动之前: 移动之后: 1.控制层 /** * 修改排序 * * ...
- word禁止自动编号
在回车.换行时使用 shift + enter
- 双击易语言没有反应,按住shift再双击可解决
参考资料:http://tieba.baidu.com/p/2987732743 的7楼.
- SAP标准培训课程C4C10学习笔记(四)第四单元
这个单元的内容是产品主数据和Price list. Hierarchy UI上按钮New的enable/disable逻辑 SAP CRM和C4C数据同步的两种方式概述:SAP PI和HCI 一种轻量 ...
- Android(java)学习笔记71:Tab标签的使用
1. 案例1---TabProject (1)首先是main.xml文件: <?xml version="1.0" encoding="utf-8"?&g ...
- openwrt定制管理
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qianguozheng/article/details/24673097 近期这个比較火,可是改了东 ...
- UIView的层次调整,及子view布局模式自动布局模式(停靠模式)
UIView*view1=[[UIView alloc]initWithFrame:CGRectMake(10,30,300,30)]; view1.backgroundColor=[UIColor ...