Here is the code given in the instructions:
class AVL {
Node root;
private class Node {
int data;
Node left, right;
int height;
private Node(int D, Node L, Node R, int H) {
data=D;
left=L;
right=R;
height=H; // user has to set height
} // of constructor Node
} //of Node
static private void UpdateHeight(Node T) {
if (T ==null) return;
else T.height = Math.max(HEIGHT(T.left),HEIGHT(T.right)) + 1;
} // UPdate Height
static private int HEIGHT(Node T) {
if (T== null ) return(-1);
else return (T.height);
}
// we need to more our right child up
static private Node LeftRotate(Node T) {
System.out.println(\"left rotate with data \" + T.data);
Node Tr;
Tr=T.right; // right child
T.right=Tr.left; // our right child IS NOW hhh
Tr.left=T; // move T down to the left
UpdateHeight(Tr.left); // update the height of T
UpdateHeight(Tr); // update hte height of the new root
return Tr;
} // of LeftRotate
// we move our immediate left node up.
// in doing so, we are now immediat right of our left child
static private Node RightRotate(Node T) {
Node Tl;
System.out.println(\"left rotate with data \" + T.data);
Tl=T.left; // left child
T.left=Tl.right; // our left child is now what our left was pointing to
Tl.right=T; // move T down to the right
UpdateHeight(Tl.right); // update the height of T
UpdateHeight(Tl); // update hte height of the new root
return Tl;
} // of RightRotate
public AVL() {
root=null;
} // of constructor AVL
// method to allow external entity to insert an element into the tree
public void insert(int D)
{
root=insert_internal(D, root);
} // of insert
private Node insert_internal(int D, Node T) {
if (T==null) return( new Node (D, null, null, 0));
if (T.data == D) return T; // the data is already in there
if ( D < T. data ) // go left
{ if (T.left == null)
{
T.left = insert_internal(D,null);
UpdateHeight(T);
}
else { //interior node
T.left = insert_internal(D, T.left);
}
} // of go left
else // D goes to the right
{ if (T.right == null)
{
T.right = insert_internal(D,null);
UpdateHeight(T);
}
else { //interior node
T.right = insert_internal(D, T.right);
}
} // of go right
// now we have to figure out if things are out of
// balance
int diff= HEIGHT(T.right) - HEIGHT(T.left);
System.out.println(\"difference is \" + diff + \" data is \" + T.data);
if ( Math.abs(diff) <= 1) // we are good to go at this level
{
UpdateHeight(T);
return(T);
}
// only if diff is bigger than 1
if ( diff > 1)// right leaning
{ // look at right child and figure out how it is leaning
} // of right leaning
else // left leaning
{ // look at left child to see how it is leaning
Node child = T.left;
int cdiff;
cdiff = HEIGHT(child.right) - HEIGHT(child.left);
System.out.println(\"cdiff is \" + cdiff);
if ( cdiff < 0 ) // left left lean
{ T=RightRotate(T); }
else
{
System.out.println(\"SHAUN\");
preorder_internal(T);
T.left = LeftRotate(T.left);
System.out.println(\"SHAUN\");
preorder_internal(T);
T=RightRotate(T);
}
} // of left leaning
// at this point we have rotated, so we need to.
General Principles of Intellectual Property: Concepts of Intellectual Proper...
Here is the code given in the instructionsclass AVL {.pdf
1. Here is the code given in the instructions:
class AVL {
Node root;
private class Node {
int data;
Node left, right;
int height;
private Node(int D, Node L, Node R, int H) {
data=D;
left=L;
right=R;
height=H; // user has to set height
} // of constructor Node
} //of Node
static private void UpdateHeight(Node T) {
if (T ==null) return;
else T.height = Math.max(HEIGHT(T.left),HEIGHT(T.right)) + 1;
} // UPdate Height
static private int HEIGHT(Node T) {
if (T== null ) return(-1);
else return (T.height);
}
// we need to more our right child up
static private Node LeftRotate(Node T) {
2. System.out.println("left rotate with data " + T.data);
Node Tr;
Tr=T.right; // right child
T.right=Tr.left; // our right child IS NOW hhh
Tr.left=T; // move T down to the left
UpdateHeight(Tr.left); // update the height of T
UpdateHeight(Tr); // update hte height of the new root
return Tr;
} // of LeftRotate
// we move our immediate left node up.
// in doing so, we are now immediat right of our left child
static private Node RightRotate(Node T) {
Node Tl;
System.out.println("left rotate with data " + T.data);
Tl=T.left; // left child
T.left=Tl.right; // our left child is now what our left was pointing to
Tl.right=T; // move T down to the right
UpdateHeight(Tl.right); // update the height of T
UpdateHeight(Tl); // update hte height of the new root
return Tl;
} // of RightRotate
public AVL() {
root=null;
} // of constructor AVL
3. // method to allow external entity to insert an element into the tree
public void insert(int D)
{
root=insert_internal(D, root);
} // of insert
private Node insert_internal(int D, Node T) {
if (T==null) return( new Node (D, null, null, 0));
if (T.data == D) return T; // the data is already in there
if ( D < T. data ) // go left
{ if (T.left == null)
{
T.left = insert_internal(D,null);
UpdateHeight(T);
}
else { //interior node
T.left = insert_internal(D, T.left);
}
} // of go left
else // D goes to the right
{ if (T.right == null)
{
T.right = insert_internal(D,null);
UpdateHeight(T);
}
else { //interior node
T.right = insert_internal(D, T.right);
}
} // of go right
4. // now we have to figure out if things are out of
// balance
int diff= HEIGHT(T.right) - HEIGHT(T.left);
System.out.println("difference is " + diff + " data is " + T.data);
if ( Math.abs(diff) <= 1) // we are good to go at this level
{
UpdateHeight(T);
return(T);
}
// only if diff is bigger than 1
if ( diff > 1)// right leaning
{ // look at right child and figure out how it is leaning
} // of right leaning
else // left leaning
{ // look at left child to see how it is leaning
Node child = T.left;
int cdiff;
cdiff = HEIGHT(child.right) - HEIGHT(child.left);
System.out.println("cdiff is " + cdiff);
if ( cdiff < 0 ) // left left lean
{ T=RightRotate(T); }
else
6. } // of else
} // or preorder_internal
}// of AVL
class avltester {
public static void main(String args[]) {
AVL T;
T=new AVL();
T.insert(5);
T.preorder();
T.insert(3);
T.preorder();
T.insert(4);
T.preorder();
} // of main
} // of avltester
class AVL {
Node root;
private class Node {
7. int data;
Node left, right;
int height;
private Node(int D, Node L, Node R, int H) {
data=D;
left=L;
right=R;
height=H; // user has to set height
} // of constructor Node
} //of Node
static private void UpdateHeight(Node T) {
if (T ==null) return;
else T.height = Math.max(HEIGHT(T.left),HEIGHT(T.right)) + 1;
} // UPdate Height
static private int HEIGHT(Node T) {
if (T== null ) return(-1);
else return (T.height);
}
// we need to more our right child up
static private Node LeftRotate(Node T) {
System.out.println("left rotate with data " + T.data);
Node Tr;
Tr=T.right; // right child
T.right=Tr.left; // our right child IS NOW hhh
Tr.left=T; // move T down to the left
UpdateHeight(Tr.left); // update the height of T
UpdateHeight(Tr); // update hte height of the new root
return Tr;
8. } // of LeftRotate
// we move our immediate left node up.
// in doing so, we are now immediat right of our left child
static private Node RightRotate(Node T) {
Node Tl;
System.out.println("left rotate with data " + T.data);
Tl=T.left; // left child
T.left=Tl.right; // our left child is now what our left was pointing to
Tl.right=T; // move T down to the right
UpdateHeight(Tl.right); // update the height of T
UpdateHeight(Tl); // update hte height of the new root
return Tl;
} // of RightRotate
public AVL() {
root=null;
} // of constructor AVL
// method to allow external entity to insert an element into the tree
public void insert(int D)
{
root=insert_internal(D, root);
} // of insert
private Node insert_internal(int D, Node T) {
9. if (T==null) return( new Node (D, null, null, 0));
if (T.data == D) return T; // the data is already in there
if ( D < T. data ) // go left
{ if (T.left == null)
{
T.left = insert_internal(D,null);
UpdateHeight(T);
}
else { //interior node
T.left = insert_internal(D, T.left);
}
} // of go left
else // D goes to the right
{ if (T.right == null)
{
T.right = insert_internal(D,null);
UpdateHeight(T);
}
else { //interior node
T.right = insert_internal(D, T.right);
}
} // of go right
// now we have to figure out if things are out of
// balance
int diff= HEIGHT(T.right) - HEIGHT(T.left);
System.out.println("difference is " + diff + " data is " + T.data);
10. if ( Math.abs(diff) <= 1) // we are good to go at this level
{
UpdateHeight(T);
return(T);
}
// only if diff is bigger than 1
if ( diff > 1)// right leaning
{ // look at right child and figure out how it is leaning
} // of right leaning
else // left leaning
{ // look at left child to see how it is leaning
Node child = T.left;
int cdiff;
cdiff = HEIGHT(child.right) - HEIGHT(child.left);
System.out.println("cdiff is " + cdiff);
if ( cdiff < 0 ) // left left lean
{ T=RightRotate(T); }
else
{
System.out.println("SHAUN");
preorder_internal(T);
T.left = LeftRotate(T.left);
System.out.println("SHAUN");
preorder_internal(T);
T=RightRotate(T);
}
11. } // of left leaning
// at this point we have rotated, so we need to update
// the height of our current tree
UpdateHeight(T);
return(T);
} // of insert_internal
public void preorder() {
System.out.println("preorder");
preorder_internal(root);
} // of preorder
private void preorder_internal(Node T) {
if (T==null) return;
else { System.out.println(T.data + " height " + T.height);
preorder_internal(T.left);
preorder_internal(T.right);
return;
} // of else
} // or preorder_internal
}// of AVL
class avltester {
12. public static void main(String args[]) {
AVL T;
T=new AVL();
T.insert(5);
T.preorder();
T.insert(3);
T.preorder();
T.insert(4);
T.preorder();
} // of main
} // of avltester
You are to create AVL tree code which implements the following methods insert (int D) delete
(int D) preorderprint() postorderprint0 inorderprint() Whenever an insertion or deletion occurs,
you are to rebalance the tree. You may use my code HERE as a starting point. There is no
guarantee that my code is correct. It implements a left insertion. You will need to implement
deletion using web resources, etc. (MAKE SURE YOU UNDERSTAND LEFT AND RIGHT
ROTATION One of these will be on the final exam).
Solution
AVL tree code implement : * Java Program to Implement AVL Tree */ import
java.util.Scanner; /* Class AVLNode */ class AVLNode /* Class AVLNode */
class AVLNode { AVLNode left, right; int data; int height; /*
Constructor */ public AVLNode() { left = null; right = null; data
13. = 0; height = 0; } /* Constructor */ public AVLNode(int n) {
left = null; right = null; data = n; height = 0; } } /* Class
AVLTree */ class AVLTree { private AVLNode root; /* Constructor */
public AVLTree() { root = null; } /* Function to check if tree is empty */
public boolean isEmpty() { return root == null; } /* Make the tree
logically empty */ public void makeEmpty() { root = null; } /*
Function to insert data */ public void insert(int data) { root = insert(data, root);
} /* Function to get height of node */ private int height(AVLNode t ) {
return t == null ? -1 : t.height; } /* Function to max of left/right node */ private int
max(int lhs, int rhs) { return lhs > rhs ? lhs : rhs; } /* Function to insert
data recursively */ private AVLNode insert(int x, AVLNode t) { if (t == null)
t = new AVLNode(x); else if (x < t.data) { t.left = insert( x, t.left
); if( height( t.left ) - height( t.right ) == 2 ) if( x < t.left.data )
t = rotateWithLeftChild( t ); else t = doubleWithLeftChild( t );
} else if( x > t.data ) { t.right = insert( x, t.right ); if( height(
t.right ) - height( t.left ) == 2 ) if( x > t.right.data) t =
rotateWithRightChild( t ); else t = doubleWithRightChild( t );
} else ; // Duplicate; do nothing t.height = max( height( t.left ), height(
t.right ) ) + 1; return t; } /* Rotate binary tree node with left child */
private AVLNode rotateWithLeftChild(AVLNode k2) { AVLNode k1 = k2.left;
k2.left = k1.right; k1.right = k2; k2.height = max( height( k2.left ), height(
k2.right ) ) + 1; k1.height = max( height( k1.left ), k2.height ) + 1; return k1;
} /* Rotate binary tree node with right child */ private AVLNode
rotateWithRightChild(AVLNode k1) { AVLNode k2 = k1.right; k1.right =
k2.left; k2.left = k1; k1.height = max( height( k1.left ), height( k1.right ) ) + 1;
k2.height = max( height( k2.right ), k1.height ) + 1; return k2; } /** *
Double rotate binary tree node: first left child * with its right child; then node k3 with new
left child */ private AVLNode doubleWithLeftChild(AVLNode k3) { k3.left =
rotateWithRightChild( k3.left ); return rotateWithLeftChild( k3 ); } /** *
Double rotate binary tree node: first right child * with its left child; then node k1 with new
right child */ private AVLNode doubleWithRightChild(AVLNode k1) {
k1.right = rotateWithLeftChild( k1.right ); return rotateWithRightChild( k1 ); }
/* Functions to count number of nodes */ public int countNodes() { return
countNodes(root); } private int countNodes(AVLNode r) { if (r == null)
return 0; else { int l = 1; l += countNodes(r.left);
l += countNodes(r.right); return l; } } /* Functions to search for an
14. element */ public boolean search(int val) { return search(root, val); }
private boolean search(AVLNode r, int val) { boolean found = false; while
((r != null) && !found) { int rval = r.data; if (val < rval) r
= r.left; else if (val > rval) r = r.right; else {
found = true; break; } found = search(r, val); }
return found; } /* Function for inorder traversal */ public void inorder() {
inorder(root); } private void inorder(AVLNode r) { if (r != null)
{ inorder(r.left); System.out.print(r.data +" "); inorder(r.right);
} } /* Function for preorder traversal */ public void preorder() {
preorder(root); } private void preorder(AVLNode r) { if (r != null)
{ System.out.print(r.data +" "); preorder(r.left);
preorder(r.right); } } /* Function for postorder traversal */ public void
postorder() { postorder(root); } private void postorder(AVLNode r) {
if (r != null) { postorder(r.left); postorder(r.right);
System.out.print(r.data +" "); } } } /* Class AVL Tree Test */
public class AVLTreeTest { public static void main(String[] args) {
Scanner scan = new Scanner(System.in); /* Creating object of AVLTree */
AVLTree avlt = new AVLTree(); System.out.println("AVLTree Tree Test ");
char ch; /* Perform tree operations */ do {
System.out.println(" AVLTree Operations "); System.out.println("1. insert ");
System.out.println("2. search"); System.out.println("3. count nodes");
System.out.println("4. check empty"); System.out.println("5. clear tree");
int choice = scan.nextInt(); switch (choice) { case 1 :
System.out.println("Enter integer element to insert"); avlt.insert( scan.nextInt()
); break; case 2 :
System.out.println("Enter integer element to search"); System.out.println("Search
result : "+ avlt.search( scan.nextInt() )); break;
case 3 : System.out.println("Nodes = "+ avlt.countNodes()); break;
case 4 : System.out.println("Empty status = "+ avlt.isEmpty());
break; case 5 : System.out.println(" Tree Cleared");
avlt.makeEmpty(); break; default :
System.out.println("Wrong Entry "); break; } /* Display tree
*/ System.out.print(" Post order : "); avlt.postorder();
System.out.print(" Pre order : "); avlt.preorder(); System.out.print(" In
order : "); avlt.inorder(); System.out.println(" Do you want to continue
(Type y or n) "); ch = scan.next().charAt(0); } while (ch ==