AVLTree program and Binary Tree program help

In summary, the conversation discusses the task of creating a Java program to construct an AVL tree, generating 100 random numbers to insert into the tree, and randomly deleting 50 of those numbers. The conversation also mentions using an AVL tree animation from a textbook to understand the behavior of the tree during insertion and deletion. Additionally, there is a mention of errors in the BinaryTree and AVLTree programs that need to be resolved in order to create a test class for the program. The conversation includes code for the BinaryTree class, which includes methods for searching, inserting, and traversing the tree.
  • #1
DODGEVIPER13
672
0

Homework Statement


Write a java program to construct an AVL tree and then generate 100 random numbers to insert to this tree and then delete randomly 50 of these random numbers from this AVL tree.

(use the AVL tree animation of your book to understand the bahavior of the this tree in the case of insertion and deletion, www.cs.armstrong.edu/liang/animation/AVLTreeAnimation.html).



Homework Equations





The Attempt at a Solution


The program BinaryTree errors deal with the inorder method I am not sure what the heck is wrong with it becuase it came straight from the book I would just like it so that I can create a test class for it but I can't resolve this error. There is also an error with my AVLTree program its updateheigth method is not quite right.

Code:
public class BinaryTree<E extends Comparable<E>> extends Abstracttree<E> {
    
    protected TreeNode<E> root;
    protected int size = 0;
    
    public BinaryTree(){
    
}
    public BinaryTree(E[] objects){
        for(int i = 0;i < objects.length; i++)
            insert(objects[i]);
    }
    public boolean search(E e){
       TreeNode<E> current = root;
        while ( current != null){
            if(e.compareTo(current.element)< 0){
                current = current.left;
            }
            else if (e.compareTo(current.element) > 0){
                current = current.right;
            }
            else
                return true;
        }
        return false;
    }
    public boolean insert(E e){
        if(root == null)
            root = createNewNode(e);
        else{
            TreeNode<E> parent = null;
            TreeNode<E> current = root;
            while(current != null)
                if (e.compareTo(current.element) < 0){
                    parent = current;
                    current = current.left;
                }
                else if (e.compareTo(current.element) > 0){
                    parent = current;
                    current = current.right;
                }
            else
                    return false;
            
            if(e.compareTo(parent.element)< 0)
                parent.left = createNewNode(e);
            else
                parent.right = createNewNode(e);
        }
        size++;
        return true;
    }
    protected TreeNode<E> createNewNode(E e){
        return new TreeNode<E>(e);
}
    public void inorder(){
        inorder(root);
    }
    protected void inorder(TreeNode<E> root){
        if(root== null) return;
        inorder(root.left);
        System.out.print(root.element + " ");
        inorder(root.right);
    } 
    public void postorder(){
        postorder(root);
    }
    protected void postorder(TreeNode<E> root){
        if(root== null) return;
        postorder(root.left);
        postorder(root.right);
        System.out.print(root.element + " ");
    }
    public void preorder() {
        preorder(root);
    }
    protected void preorder(TreeNode<E> root){
        if(root == null) return;
        System.out.print(root.element + " ");
        preorder(root.left);
        preorder(root.right);
    }

    @Override
    public void inOrder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    public static class TreeNode<E extends Comparable<E>>{
        E element;
        TreeNode<E> left;
        TreeNode<E> right;
        
        public TreeNode(E e){
            element = e;
        }
    }
    public int getSize(){
        return size;
    }
    public TreeNode getRoot(){
        return root;
    }
    public java.util.ArrayList<TreeNode<E>> path(E e) {
        java.util.ArrayList<TreeNode<E>> list = new java.util.ArrayList<TreeNode<E>>();
        TreeNode<E> current = root;
        
        while(current != null){
            list.add(current);
            if(e.compareTo(current.element) < 0){
                current = current.left;
            }
            else if (e.compareTo(current.element) > 0){
                current = current.right;
            }
            else break;
        }
        return list;
    }
    public boolean delete(E e){
        TreeNode<E> parent = null;
        TreeNode<E> current = root;
        while(current != null){
            if(e.compareTo(current.element) < 0){
                parent = current;
                current = current.left;
            }
            else if (e.compareTo(current.element) > 0){
                parent = current;
                current = current.right;
            }
            else
                break;
        }
        if(current == null)
            return false;
        if(current.left == null){
            if(parent == null){
                root = current.right;
            }
            else{
                if(e.compareTo(parent.element) < 0)
                    parent.left = current.right;
                else 
                    parent.right = current.right;
            }
        }
        else{
            TreeNode<E> parentOfRightMost = current;
            TreeNode<E> rightMost = current.left;
            
            while(rightMost.right != null){
                parentOfRightMost = rightMost;
                rightMost  = rightMost.right;
            }
            current.element = rightMost.element;
            
            if(parentOfRightMost.right == rightMost)
                parentOfRightMost.right = rightMost.left;
            else
                parentOfRightMost.left = rightMost.left;
        }
        size--;
        return true;
    }
    public java.util.Iterator iterator(){
        return inorderIterator();
    }
    public java.util.Iterator inorderIterator(){
        return new InorderIterator();
    }
    class InorderIterator implements java.util.Iterator {
        private java.util.ArrayList<E> list = new java.util.ArrayList<E>();
        private int current = 0;
        
        public InorderIterator(){
        inorder();
    }
        public void inorder(TreeNode<E> root){
            if(root == null) return;
            inorder(root.left);
            list.add(root.element);
            inorder(root.right);
        }
        public boolean hasNext(){
            if(current < list.size())
                return true;
            
            return false;
        }
        public Object next(){
            return list.get(current++);
        }
        public void remove(){
            delete(list.get(current));
            list.clear();
            inorder();
        }

        private void inorder() {
            throw new UnsupportedOperationException("Not yet implemented");
        }
    }
    public void clear(){
        root = null;
        size = 0;
                
    }
}



Code:
public abstract class Abstracttree<E extends Comparable<E>>implements Tree<E> {
    
    public void inorder() {
        
    }
    public void postorder() {
        
    }
    public void preorder() {
        
    }
    public boolean isEmpty() {
        return getSize() == 0;
    }
    public java.util.Iterator iterator() {
        return null;
    }
}


Code:
public interface Tree<E extends Comparable<E>> {
    
    public boolean search(E e);
    public boolean insert(E e);
    public boolean delete(E e);
    public void inOrder();
    public void postorder();
    public void preorder();
    public int getSize();
    public boolean isEmpty();
    public java.util.Iterator iterator();
}

Code:
public class AVLTree<E extends Comparable<E>> extends BinaryTree<E> {
    
    public AVLTree(){
        
    }
    public AVLTree(E[] objects){
        super(objects);
    }
    @Override
    protected AVLTreeNode<E> createNewNode(E o){
        return new AVLTreeNode<E>(o);
    }
    public boolean insert(E o){
       boolean successful = super.insert(o);
        if (!successful)
        return false; // o is already in the tree
            else {
               balancePath(o); // Balance from o to the root if necessary
                }

 return true; //
    }    
   
private int balanceFactor(AVLTreeNode<E> node) {
    if (node.right == null) // node has no right subtree
 return -node.height;
 else if (node.left == null) // node has no left subtree
 return +node.height;
 else
 return ((AVLTreeNode<E>)node.right).height -
 ((AVLTreeNode<E>)node.left).height;
        
    }
public void updateHeigth(AVLTreeNode<E> node){
        if (node.left == null && node.right == null)
            node.height = 0;
 else if (node.left == null) // node has no left subtree
 node.height = 1 + ((AVLTreeNode<E>)(node.right)).height;
 else if (node.right == null) // node has no right subtree
 node.height = 1 + ((AVLTreeNode<E>)(node.left)).height;
 else
 node.height = 1 +
 Math.max(((AVLTreeNode<E>)(node.right)).height,
 ((AVLTreeNode<E>)(node.left)).height);
 }
   
 private void balanceLL(TreeNode<E> A, TreeNode<E> parentOfA) {
        TreeNode<E> B = A.left; // A is left-heavy and B is left-heavy

 if (A == root) {
 root = B;
 }
else {
 if (parentOfA.left == A) {
 parentOfA.left = B;
 }
 else {
 parentOfA.right = B;
 }
 }

 A.left = B.right; // Make T2 the left subtree of A
 B.right = A; // Make A the left child of B
 updateHeight((AVLTreeNode<E>)A);
 updateHeight((AVLTreeNode<E>)B);
 }
        private void balanceLR(TreeNode<E> A, TreeNode<E> parentOfA) {
TreeNode<E> B = A.left; // A is left-heavy
 TreeNode<E> C = B.right; // B is right-heavy

 if (A == root) {
 root = C;
 }
 else {
 if (parentOfA.left == A) {
 parentOfA.left = C;
 }
 else {
 parentOfA.right = C;
 }
 }

 A.left = C.right; // Make T3 the left subtree of A
 B.right = C.left; // Make T2 the right subtree of B
 C.left = B;
 C.right = A;

 // Adjust heights
 updateHeight((AVLTreeNode<E>)A);
 updateHeight((AVLTreeNode<E>)B);
 updateHeight((AVLTreeNode<E>)C);
 }


        
    
private void balanceRR(TreeNode<E> A, TreeNode<E> parentOfA) {
TreeNode<E> B = A.right; // A is right-heavy and B is right-heavy

 if (A == root) {
 root = B;
 }
 else {
 if (parentOfA.left == A) {
 parentOfA.left = B;
 }
 else {
 parentOfA.right = B;
 }
 }

 A.right = B.left; // Make T2 the right subtree of A
        B.left = A;
 updateHeight((AVLTreeNode<E>)A);
 updateHeight((AVLTreeNode<E>)B);
 }
    private void balanceRL(TreeNode<E> A, TreeNode<E> parentOfA) {
       TreeNode<E> B = A.right; // A is right-heavy
 TreeNode<E> C = B.left; // B is left-heavy

 if (A == root) {
 root = C;
 }
 else {
 if (parentOfA.left == A) {
 parentOfA.left = C;
 }
 else {
 parentOfA.right = C;
 }
 }

 A.right =C.left; // Make T2 the right subtree of A
 B.left = C.right; // Make T3 the left subtree of B
 C.left = A;
 C.right = B;

 // Adjust heights
 updateHeight((AVLTreeNode<E>)A);
 updateHeight((AVLTreeNode<E>)B);
 updateHeight((AVLTreeNode<E>)C);
    }
    private void balancePath(E o){
     java.util.ArrayList<TreeNode<E>> path = path(o);
 for (int i = path.size() - 1; i >= 0; i--) {
 AVLTreeNode<E> A = (AVLTreeNode<E>)(path.get(i));
 updateHeight(A);
 AVLTreeNode<E> parentOfA = (A == root) ? null :
 (AVLTreeNode<E>)(path.get(i - 1));

 switch (balanceFactor(A)) {
 case -2:
 if (balanceFactor((AVLTreeNode<E>)A.left) <= 0) {
 balanceLL(A, parentOfA); // Perform LL rotation
 }
 else {
 balanceLR(A, parentOfA); // Perform LR rotation
 }
 break;
 case +2:
 if (balanceFactor((AVLTreeNode<E>)A.right) >= 0) {
 balanceRR(A, parentOfA); // Perform RR rotation
 }
 else {
 balanceRL(A, parentOfA); // Perform RL rotation
 }
 }
 }
 }
        
    public boolean delete(E element) {
        if (root == null)
 return false; // Element is not in the tree

 // Locate the node to be deleted and also locate its parent node
 TreeNode<E> parent = null;
 TreeNode<E> current = root;
 while (current != null) {
 if (element.compareTo(current.element) < 0) {
 parent = current;
 current = current.left;
 }
 else if (element.compareTo(current.element) > 0) {
parent = current;
 current = current.right;
 }
 else
 break; // Element is in the tree pointed by current
 }

 if (current == null)
 return false; // Element is not in the tree
if (current.left == null) {
 // Connect the parent with the right child of the current node
 if (parent == null) {
 root = current.right;
 }
 else {
 if (element.compareTo(parent.element) < 0)
 parent.left = current.right;
 else
 parent.right = current.right;
 // Balance the tree if necessary
 balancePath(parent.element);
 }
 }
 else {
 // Case 2: The current node has a left child
 // Locate the rightmost node in the left subtree of
 // the current node and also its parent
 TreeNode<E> parentOfRightMost = current;
 TreeNode<E> rightMost = current.left;

 while (rightMost.right != null) {
 parentOfRightMost = rightMost;
 rightMost = rightMost.right; // Keep going to the right
 }

 // Replace the element in current by the element in rightMost
 current.element = rightMost.element;

 // Eliminate rightmost node
if (parentOfRightMost.right == rightMost)
parentOfRightMost.right = rightMost.left;
 else
 // Special case: parentOfRightMost is current
 parentOfRightMost.left = rightMost.left;

 // Balance the tree if necessary
 balancePath(parentOfRightMost.element);
 }

 size--;
 return true; // Element insert
 // Case 1: current has no left children (See Figure 23.6)
    }

    private void updateHeight(AVLTreeNode<E> avlTreeNode) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
    protected static class AVLTreeNode<E extends Comparable<E>>
    extends BinaryTree.TreeNode<E> {
        int height = 0;
        public AVLTreeNode(E o) {
            super(o);
        }
    }
}
 
Last edited:
Physics news on Phys.org
  • #2


public class TestAVLTree {
public static void main(String[] args) {
// Create an AVL tree
AVLTree<Integer> tree = new AVLTree<>();
for (int i = 0; i < 100; i++) {
tree.insert(i);
}
tree.insert(15);
tree.insert(14);
tree.insert(13);
tree.insert(12);
tree.insert(11);
tree.insert(10);
tree.insert(9);
tree.insert(8);
tree.insert(7);
tree.insert(6);
tree.insert(5);
tree.insert(4);
tree.insert(3);
tree.insert(2);
tree.insert(1);
tree.insert(0);
tree.delete(8);
tree.delete(9);
tree.delete(10);
tree.delete(11);
tree.delete(12);
tree.delete(13);
tree.delete(14);
tree.delete(15);
tree.delete(16);
tree.delete(17);
tree.delete(18);
tree.delete(19);
tree.delete(20);
tree.delete(21);
tree.delete(22);
tree.delete(23);
tree.delete(24);
tree.delete(25);
tree.delete(26);
tree.delete(27);
tree.delete(28);
tree.delete(29);
tree.delete(30);
tree.delete(31);
tree.delete(32);
tree.delete(33);
tree.delete(34);
tree.delete(35);
tree.delete(36);
tree.delete(37);
tree.delete(38);
tree.delete(39);
tree.delete(40);
tree.delete(41);
tree.delete(42);
tree.delete(43);
tree.delete(44);
tree.delete(45);
tree.delete(46);
tree.delete(47);
tree.delete(48);
tree.delete(49);
tree.delete(50);
tree.delete(51);
tree.delete(52);
tree.delete(53);
tree.delete(54);
tree.delete(55);
tree.delete(56);
tree.delete(57);
tree.delete(58);
tree.delete(59);
tree.delete(60);
tree.delete(61);
tree.delete(62);
tree.delete(63);
tree.delete(64);
tree.delete(65);
tree.delete(66);
tree.delete(67);
tree.delete(68);
tree.delete(69);
tree.delete(70);
tree.delete(71);
tree.delete(72);
tree.delete(73);
tree.delete(74);
tree.delete(75);
tree.delete(76);
tree.delete(77);
tree.delete(78);
tree.delete(79);
tree.delete(80
 

1. What is an AVLTree program and how does it differ from a Binary Tree program?

An AVLTree program is a type of self-balancing binary search tree that maintains a balanced tree structure by performing rotations whenever necessary. This helps to improve the efficiency of operations such as insertion, deletion, and searching. In contrast, a Binary Tree program does not have the self-balancing feature and can become unbalanced, leading to decreased performance.

2. What are the advantages of using an AVLTree program?

One of the main advantages of using an AVLTree program is that it ensures the tree remains balanced, which results in faster operations. This is especially beneficial for applications that require frequent insertions and deletions. Additionally, AVLTree programs have a worst-case time complexity of O(log n) for these operations, making them more efficient than Binary Trees in some cases.

3. How does the balancing process work in an AVLTree program?

The balancing process in an AVLTree program involves performing rotations on the tree whenever a node becomes unbalanced. This means that the heights of the left and right subtrees of a node differ by more than 1. Depending on the type of imbalance, single or double rotations may be performed to restore balance in the tree.

4. Are there any limitations to using an AVLTree program?

One limitation of AVLTree programs is that they require extra space to store the balance factor for each node, which can increase memory usage. Additionally, the balancing process can also be time-consuming, making it less suitable for real-time applications with strict time constraints.

5. How can I implement an AVLTree program in my code?

There are several ways to implement an AVLTree program, depending on the programming language you are using. Many programming languages have built-in AVLTree data structures and methods, while others may require you to code the structure and algorithms manually. It is important to understand the basic principles and algorithms of AVLTree programs before attempting to implement them in your code.

Similar threads

  • Engineering and Comp Sci Homework Help
Replies
6
Views
3K
  • Engineering and Comp Sci Homework Help
Replies
1
Views
1K
  • Engineering and Comp Sci Homework Help
Replies
1
Views
2K
  • Engineering and Comp Sci Homework Help
Replies
1
Views
1K
  • Programming and Computer Science
Replies
3
Views
3K
  • Programming and Computer Science
Replies
3
Views
2K
  • Engineering and Comp Sci Homework Help
Replies
1
Views
1K
  • Engineering and Comp Sci Homework Help
Replies
5
Views
2K
  • Engineering and Comp Sci Homework Help
Replies
2
Views
3K
  • Engineering and Comp Sci Homework Help
Replies
1
Views
1K
Back
Top