196 lines
4.3 KiB
Java
196 lines
4.3 KiB
Java
package tree.avl;
|
|
|
|
class AVLTree{
|
|
private AVLNode root;
|
|
public AVLTree(){
|
|
root = null;
|
|
}
|
|
|
|
|
|
/**
|
|
*
|
|
* @param avlNode
|
|
* @return
|
|
*/
|
|
private int height(AVLNode avlNode ){
|
|
return avlNode == null ? -1 : avlNode.height;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param lHeight
|
|
* @param rHeight
|
|
* @return
|
|
*/
|
|
private int max(int lHeight, int rHeight){
|
|
return lHeight > rHeight ? lHeight : rHeight;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param data
|
|
*/
|
|
public void insert(int data){
|
|
root = insert(data, root);
|
|
}
|
|
|
|
|
|
/**
|
|
*
|
|
* @param data
|
|
* @param avlNode
|
|
* @return
|
|
*/
|
|
private AVLNode insert(int data, AVLNode avlNode)
|
|
{
|
|
if (avlNode == null)
|
|
avlNode = new AVLNode(data);
|
|
else if (data < avlNode.data){
|
|
avlNode.left = insert( data, avlNode.left );
|
|
if( height( avlNode.left ) - height( avlNode.right ) == 2 )
|
|
if( data < avlNode.left.data )
|
|
avlNode = leftRotation( avlNode );
|
|
else
|
|
avlNode = leftRightRotation( avlNode );
|
|
}
|
|
else if( data > avlNode.data ){
|
|
avlNode.right = insert( data, avlNode.right );
|
|
if( height( avlNode.right ) - height( avlNode.left ) == 2 )
|
|
if( data > avlNode.right.data)
|
|
avlNode = rightRotation( avlNode );
|
|
else
|
|
avlNode = rightLeftRotation( avlNode );
|
|
}
|
|
else
|
|
; // Duplicate; do nothing
|
|
avlNode.height = max( height( avlNode.left ), height( avlNode.right ) ) + 1;
|
|
return avlNode;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param avlNode
|
|
* @return
|
|
*/
|
|
private AVLNode leftRotation(AVLNode avlNode){
|
|
AVLNode k1 = avlNode.left;
|
|
avlNode.left = k1.right;
|
|
k1.right = avlNode;
|
|
avlNode.height = max( height( avlNode.left ), height( avlNode.right ) ) + 1;
|
|
k1.height = max( height( k1.left ), avlNode.height ) + 1;
|
|
return k1;
|
|
}
|
|
|
|
|
|
/**
|
|
*
|
|
* @param avlNode
|
|
* @return
|
|
*/
|
|
private AVLNode rightRotation(AVLNode avlNode){
|
|
AVLNode node = avlNode.right;
|
|
avlNode.right = node.left;
|
|
node.left = avlNode;
|
|
avlNode.height = max( height( avlNode.left ), height( avlNode.right ) ) + 1;
|
|
node.height = max( height( node.right ), avlNode.height ) + 1;
|
|
return node;
|
|
}
|
|
/**
|
|
* left-right rotation
|
|
* @param avlNode
|
|
* @return
|
|
*/
|
|
private AVLNode leftRightRotation(AVLNode avlNode){
|
|
avlNode.left = rightRotation( avlNode.left );
|
|
return leftRotation( avlNode );
|
|
}
|
|
|
|
/**
|
|
* right-left rotation
|
|
* @param avlNode
|
|
* @return
|
|
*/
|
|
private AVLNode rightLeftRotation(AVLNode avlNode)
|
|
{
|
|
avlNode.right = leftRotation( avlNode.right );
|
|
return rightRotation( avlNode );
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return
|
|
*/
|
|
public int countNodes(){
|
|
return countNodes(root);
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param avlNode
|
|
* @return
|
|
*/
|
|
private int countNodes(AVLNode avlNode){
|
|
if (avlNode == null)
|
|
return 0;
|
|
else{
|
|
int l = 1;
|
|
l += countNodes(avlNode.left);
|
|
l += countNodes(avlNode.right);
|
|
return l;
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param data
|
|
* @return
|
|
*/
|
|
public boolean search(int data){
|
|
return search(root, data);
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param avlNode
|
|
* @param data
|
|
* @return
|
|
*/
|
|
private boolean search(AVLNode avlNode, int data){
|
|
boolean found = false;
|
|
while ((avlNode != null) && !found)
|
|
{
|
|
int rval = avlNode.data;
|
|
if (data < rval)
|
|
avlNode = avlNode.left;
|
|
else if (data > rval)
|
|
avlNode = avlNode.right;
|
|
else
|
|
{
|
|
found = true;
|
|
break;
|
|
}
|
|
found = search(avlNode, data);
|
|
}
|
|
return found;
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
public void inorder(){
|
|
inorder(root);
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param avlNode
|
|
*/
|
|
private void inorder(AVLNode avlNode){
|
|
if (avlNode != null){
|
|
inorder(avlNode.left);
|
|
System.out.print(avlNode.data +" ");
|
|
inorder(avlNode.right);
|
|
}
|
|
}
|
|
}
|