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树的更多相关文章

  1. Java数据结构——AVL树

    AVL树(平衡二叉树)定义 AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,并且拥有自平衡机制.在AV ...

  2. JAVA数据结构--AVL树的实现

    AVL树的定义 在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度都是.增 ...

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

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

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

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

  5. AVL树----java

                                                                                        AVL树----java AVL ...

  6. AVL树之 Java的实现

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

  7. AVL树的Java实现

    AVL树:平衡的二叉搜索树,其子树也是AVL树. 以下是我实现AVL树的源码(使用了泛型): import java.util.Comparator; public class AVLTree< ...

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

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

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

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

随机推荐

  1. DIV三列同行

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. .net函数

    Math.Ceiling() Math.Floor() == 向上取整,向下取整 Regex.Split(productListControl.Text, "\n", RegexO ...

  3. Linux centos6.x 配置免密码登录

    免密码登录主要就是被访机器提供公匙给访问者,然后访问者使用ssh协议时可以使用所配置好的公匙验证.这样就免去了输入密码的麻烦. 某些集群例如hadoop,一般都需要将主机和其他机器间配置无密码公匙认证 ...

  4. 《ArcGIS Runtime SDK for Android开发笔记》——(8)、关于ArcGIS Android开发的未来(“Quartz”版Beta)

    1.前言 今天再一次在官网看到了ArcGIS Runtime SDK for Android下一个版本“Quartz”版的更新资料,它将是一个非常重要的更新,包括API接口的重构和开发思路的调整.具体 ...

  5. react-native与原生界面相互跳转

    一.添加MyIntentModule类,并继承ReactContextBaseJavaModule实现其方法和构造函数.在该类中添加方法,注意:方法头要加@ReactMethod public cla ...

  6. layui文档阅读进度

    2017年1月9日22:13:28已看完layer弹出层部分 2017年1月9日19:15:55http://www.layui.com/doc/modules/layer.html#layer.lo ...

  7. Socket连接时,端口是怎么分配的

    socket 客户端连接socket 的端口每个是唯一的,每个新的连接,端口号+1 从1024-65534 最大到65534 然后再开始循环 中间遇到已经使用的端口就跳过

  8. 谁动了我的I/O?

    首先,是信用卡账单欠款0.13美刀~~~然后上亚马逊云查了一下账单. 3M次I/O...(1215133次超额的,2000000次免费的.) 于是监控了一下数据:每秒至少写5次,每秒写300KB,平均 ...

  9. 用户表单事件(focus事件)

    以前做用户系统的时候经常用到表单验证,正则表达式事件来处理和绑定事件和进行事件,这里说的其实只是一小部分,也不是很值得写,但是今天遇到了还是写一下,毕竟基础还是蛮重要的,就算懂的童鞋,巩固一下也是好的 ...

  10. April 14 2017 Week 15 Friday

    Try to be a rainbow in someone's cloud. 当乌云萦绕心头,我愿意成为你的彩虹. Actually there are many rainbows in our l ...