Here is the code given in the instructions class AVL Node r
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 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 {
 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 {
 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 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 {
 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
 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 = 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 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 == \'Y\'|| ch == \'y\'); }






