Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Here is the code given in the instructions: class AVL { Node root; private class

ID: 3774746 • Letter: H

Question


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
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).

Explanation / Answer

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.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.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'); }