Advertisement
Guest User

Untitled

a guest
Apr 20th, 2015
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.24 KB | None | 0 0
  1. package AVL;
  2.  
  3. import java.util.Iterator;
  4.  
  5. public class AVLTree<T> {
  6.  
  7.     private AVLNode<T> root;
  8.     private int size;
  9.  
  10.     public AVLTree() {
  11.         this.root = null;
  12.         this.size = 0;
  13.     }
  14.  
  15.     public void addElement(T element) {
  16.         if (element == null)
  17.             return;
  18.         else
  19.             root = addElementHelper(root, element);
  20.  
  21.     }
  22.  
  23.     private AVLNode<T> addElementHelper(AVLNode<T> newRoot, T element) {
  24.         if (root == null) {
  25.             size++;
  26.             return new AVLNode<T>(element);
  27.         }
  28.         Comparable<T> compareElement = (Comparable<T>) element;
  29.         if (compareElement.compareTo(newRoot.getElement()) < 0) {
  30.             newRoot.setLeftLeaf(addElementHelper(newRoot.getLeftLeaf(), element));
  31.             if (height(newRoot.getLeftLeaf()) - height(newRoot.getRightLeaf()) == 2) {
  32.                 newRoot = leftRotation(newRoot);
  33.             } else {
  34.                 newRoot = rightLeftRotation(newRoot);
  35.             }
  36.         } else if (compareElement.compareTo(newRoot.getElement()) > 0) {
  37.             newRoot.setRightLeaf(addElementHelper(newRoot.getRightLeaf(),
  38.                     element));
  39.             if (height(newRoot.getRightLeaf()) - height(newRoot.getLeftLeaf()) == 2) {
  40.                 if (height(newRoot.getRightLeaf())
  41.                         - height(newRoot.getLeftLeaf()) == 2) {
  42.                     newRoot = rightRotation(newRoot);
  43.                 } else {
  44.                     newRoot = leftRightRotation(newRoot);
  45.                 }
  46.             }
  47.         }
  48.         newRoot.setHeight(Math.max(height(newRoot.getLeftLeaf()),
  49.                 height(newRoot.getRightLeaf())) + 1);
  50.         return newRoot;
  51.     }
  52.  
  53.     public T find(T element) throws EmptyCollectionException,
  54.             ElementNotFoundException {
  55.         if (isEmpty()) {
  56.             throw new EmptyCollectionException("AVLTree");
  57.         }
  58.         if (element == null) {
  59.             return null;
  60.         }
  61.         AVLNode<T> resultsNode = findHelper(root, element);
  62.         if (resultsNode == null) {
  63.             throw new ElementNotFoundException("AVLTree");
  64.         } else {
  65.             return resultsNode.getElement();
  66.         }
  67.     }
  68.  
  69.     private AVLNode<T> findHelper(AVLNode<T> newRoot, T element) {
  70.         if (newRoot == null)
  71.             return null;
  72.         @SuppressWarnings("unchecked")
  73.         Comparable<T> comparableElement = (Comparable<T>) element;
  74.         if (comparableElement.compareTo(newRoot.getElement()) < 0)
  75.             return findHelper(newRoot.getLeftLeaf(), element);
  76.         if (comparableElement.compareTo(newRoot.getElement()) > 0)
  77.             return findHelper(newRoot.getRightLeaf(), element);
  78.         else
  79.             return newRoot;
  80.     }
  81.  
  82.     public T removeElement(T targetElement) throws EmptyCollectionException {
  83.         if (isEmpty())
  84.             throw new EmptyCollectionException("AVL Tree");
  85.         root = removeElementHelper(root, targetElement);
  86.         return targetElement;
  87.     }
  88.  
  89.     private AVLNode<T> removeElementHelper(AVLNode<T> newRoot, T element)
  90.             throws ElementNotFoundException {
  91.         if (newRoot == null) {
  92.             throw new ElementNotFoundException("AVL Tree");
  93.         }
  94.         Comparable<T> comparableElement = (Comparable<T>) element;
  95.         if (comparableElement.compareTo(newRoot.getElement()) < 0) {
  96.             newRoot.setLeftLeaf(removeElementHelper(newRoot.getLeftLeaf(),
  97.                     element));
  98.             if (height(newRoot.getRightLeaf()) - height(newRoot.getLeftLeaf()) == 2) {
  99.                 if (height(newRoot.getRightLeaf().getRightLeaf()) >= height(newRoot
  100.                         .getRightLeaf().getLeftLeaf()))
  101.                     newRoot = rightRotation(newRoot);
  102.                 else
  103.                     newRoot = leftRightRotation(newRoot);
  104.             }
  105.         } else if (comparableElement.compareTo(newRoot.getElement()) > 0) {
  106.             newRoot.setRightLeaf(removeElementHelper(newRoot.getRightLeaf(),
  107.                     element));
  108.             if (height(newRoot.getLeftLeaf()) - height(newRoot.getRightLeaf()) == 2) {
  109.                 if (height(newRoot.getLeftLeaf().getLeftLeaf()) >= height(newRoot
  110.                         .getLeftLeaf().getRightLeaf()))
  111.                     newRoot = leftRotation(newRoot);
  112.                 else
  113.                     newRoot = rightLeftRotation(newRoot);
  114.             }
  115.         } else {
  116.             return getNewNode(newRoot);
  117.         }
  118.         newRoot.setHeight(Math.max(height(newRoot.getLeftLeaf()),
  119.                 height(newRoot.getRightLeaf())) + 1);
  120.         return newRoot;
  121.     }
  122.  
  123.     private AVLNode<T> getNewNode(AVLNode<T> node) {
  124.         AVLNode<T> newNode;
  125.  
  126.         if (node.getLeftLeaf() != null && node.getRightLeaf() != null) {
  127.  
  128.             newNode = findMinHelper(node.getRightLeaf());
  129.             node.setRightLeaf(removeElementHelper(node.getRightLeaf(),
  130.                     newNode.getElement()));
  131.             newNode.setLeftLeaf(node.getLeftLeaf());
  132.             newNode.setRightLeaf(node.getRightLeaf());
  133.  
  134.             if (height(newNode.getLeftLeaf()) - height(newNode.getRightLeaf()) == 2) {
  135.  
  136.                 if (height(newNode.getLeftLeaf().getLeftLeaf()) >= height(newNode
  137.                         .getLeftLeaf().getRightLeaf()))
  138.                     newNode = leftRotation(newNode);
  139.  
  140.                 else
  141.                     newNode = rightLeftRotation(newNode);
  142.             }
  143.  
  144.             newNode.setHeight(Math.max(height(newNode.getLeftLeaf()),
  145.                     height(newNode.getRightLeaf())) + 1);
  146.  
  147.         }
  148.  
  149.         else {
  150.             if (node.getLeftLeaf() != null)
  151.                 newNode = node.getLeftLeaf();
  152.             else
  153.                 newNode = node.getRightLeaf();
  154.  
  155.             size--;
  156.         }
  157.  
  158.         node.setLeftLeaf(null);
  159.         node.setRightLeaf(null);
  160.  
  161.         return newNode;
  162.     }
  163.  
  164.     private AVLNode<T> findMinHelper(AVLNode<T> newNode) {
  165.         if (newNode.getLeftLeaf() == null)
  166.             return newNode;
  167.         else
  168.             return findMinHelper(newNode.getLeftLeaf());
  169.     }
  170.  
  171.     private AVLNode<T> leftRotation(AVLNode<T> node) {
  172.  
  173.         AVLNode<T> newRoot = node.getLeftLeaf();
  174.         node.setLeftLeaf(newRoot.getRightLeaf());
  175.         newRoot.setRightLeaf(node);
  176.         node.setHeight(Math.max(height(node.getLeftLeaf()),
  177.                 height(node.getRightLeaf())) + 1);
  178.         newRoot.setHeight(Math.max(height(newRoot.getLeftLeaf()),
  179.                 node.getHeight()) + 1);
  180.         return newRoot;
  181.     }
  182.  
  183.     private AVLNode<T> rightRotation(AVLNode<T> node) {
  184.  
  185.         AVLNode<T> newRoot = node.getRightLeaf();
  186.         node.setRightLeaf(newRoot.getLeftLeaf());
  187.         newRoot.setLeftLeaf(node);
  188.         node.setHeight(Math.max(height(node.getLeftLeaf()),
  189.                 height(node.getRightLeaf())) + 1);
  190.         newRoot.setHeight(Math.max(node.getHeight(),
  191.                 height(newRoot.getRightLeaf())) + 1);
  192.         return newRoot;
  193.  
  194.     }
  195.  
  196.     private AVLNode<T> rightLeftRotation(AVLNode<T> node) {
  197.  
  198.         node.setLeftLeaf(rightRotation(node.getLeftLeaf()));
  199.         return leftRotation(node);
  200.     }
  201.  
  202.     private AVLNode<T> leftRightRotation(AVLNode<T> node) {
  203.  
  204.         node.setRightLeaf(leftRotation(node.getRightLeaf()));
  205.         return rightRotation(node);
  206.     }
  207.  
  208.     public int height(AVLNode<T> newNode) {
  209.         if (newNode == null)
  210.             return -1;
  211.         else
  212.             return newNode.getHeight();
  213.  
  214.     }
  215.  
  216.     public boolean isEmpty() {
  217.         if (size() == 0)
  218.             return true;
  219.         else
  220.             return false;
  221.     }
  222.  
  223.     public int size() {
  224.         return size;
  225.     }
  226.  
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement