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

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 = 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\'); }
 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, Nod
 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, Nod
 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, Nod
 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, Nod
 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, Nod
 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, Nod
 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, Nod

Get Help Now

Submit a Take Down Notice

Tutor
Tutor: Dr Jack
Most rated tutor on our site