Advertisement
Lesnic

DSA 3

Mar 27th, 2020
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.81 KB | None | 0 0
  1. // Gorozhankin Egor BS19-01
  2.  
  3.  
  4. public class AVL_Tree<T> implements Comparable<T> {
  5.     private Node<T> top;
  6.  
  7.     // return height of the node (for null node return 0)
  8.     public static int nodeHeight(Node<?> node) { // O(1)
  9.         if (node == null)
  10.             return 0;
  11.         return node.height;
  12.     }
  13.  
  14.     // return information about balance of tree or subtree
  15.     // {0, 1, -1} - balanced, otherwise unbalanced
  16.     public static int balanceFactor(Node<?> node) { // O(1)
  17.         if (node == null)
  18.             return 0;
  19.         return nodeHeight(node.left) - nodeHeight(node.right);
  20.     }
  21.    
  22.     // at field height assigns value of maximum of path to leaf
  23.     public static void calculateNodeHeight(Node<?> node) { // O(1)
  24.         if (nodeHeight(node.left) > nodeHeight(node.right))
  25.             node.height = nodeHeight(node.left) + 1;
  26.         else
  27.             node.height = nodeHeight(node.right) + 1;
  28.     }
  29.    
  30.     // add data to tree
  31.     public void add(T data) { // O(log n)
  32.         top = add(top, data);
  33.     }
  34.    
  35.     // add data to tree
  36.     @SuppressWarnings("unchecked")
  37.     private Node<T> add(Node<T> node, T key) { // O(log n)
  38.         if (node == null) {
  39.             return new Node<T>(key);
  40.         }
  41.  
  42.         if (((Comparable<T>) key).compareTo(node.key) < 0)
  43.             node.left = add(node.left, key);
  44.         else
  45.             node.right = add(node.right, key);
  46.  
  47.         node.height = 1 + (nodeHeight(node.left) > nodeHeight(node.right) ? nodeHeight(node.left) : nodeHeight(node.right));
  48.  
  49.         return nodeBalancing(key, node);
  50.     }
  51.    
  52.     // remove data from tree
  53.     public void remove(T key) { // O(log n)
  54.         top = remove(top, key);
  55.     }
  56.  
  57.     // remove data from tree
  58.     @SuppressWarnings("unchecked")
  59.     private Node<T> remove(Node<T> node, T key) { // O(log n)
  60.         if (node == null)
  61.             return node;
  62.  
  63.         if (((Comparable<T>) key).compareTo(node.key) < 0)
  64.             node.left = remove(node.left, key);
  65.         else if (((Comparable<T>) key).compareTo(node.key) > 0)
  66.             node.right = remove(node.right, key);
  67.         else {
  68.             if (node.left == null && node.right == null)
  69.                 return null;
  70.  
  71.             if (node.left == null) {
  72.                 Node<T> temp = node.right;
  73.                 node = null;
  74.                 return temp;
  75.             }
  76.  
  77.             if (node.right == null) {
  78.                 Node<T> temp = node.left;
  79.                 node = null;
  80.                 return temp;
  81.             }
  82.         }
  83.        
  84.         Node<T> temp = node.left;
  85.         while (temp.right != null)
  86.             temp = temp.right;
  87.         node.key = temp.key;
  88.         node.left = remove(node.left, temp.key);
  89.  
  90.         calculateNodeHeight(node);
  91.         return nodeBalancing(node);
  92.     }
  93.  
  94.     // check balance of tree or tree and make rotations if it need
  95.     private Node<T> nodeBalancing(Node<T> node) { // O(1)
  96.         int balance = balanceFactor(node);
  97.  
  98.         if (balance > 1) {
  99.             if (balanceFactor(node.left) < 0) {
  100.                 node.left = leftRotation(node.left);
  101.             }
  102.             return rightRotation(node);
  103.         }
  104.  
  105.         if (balance < -1) {
  106.             if (balanceFactor(node.right) > 0) {
  107.                 node.right = rightRotation(node.right);
  108.             }
  109.             return leftRotation(node);
  110.         }
  111.  
  112.         return node;
  113.     }
  114.    
  115.     // Transformation tree to make it balanced
  116.     private Node<T> rightRotation(Node<T> node) { // O(1)
  117.         Node<T> temp = node.left;
  118.         node.left = temp.right;
  119.         temp.right = node;
  120.         calculateNodeHeight(node);
  121.         calculateNodeHeight(temp);
  122.         return temp;
  123.     }
  124.    
  125.     // Transformation tree to make it balanced
  126.     private Node<T> leftRotation(Node<T> node) { // O(1)
  127.         Node<T> temp = node.right;
  128.         node.right = temp.left;
  129.         temp.left = node;
  130.         calculateNodeHeight(node);
  131.         calculateNodeHeight(temp);
  132.         return temp;
  133.     }
  134.  
  135.     // allows us to compare to nodes
  136.     @Override
  137.     public int compareTo(T o) { // O(1)
  138.         return this.compareTo(o);
  139.     }
  140. }
  141.  
  142. class Node<T> implements Comparable<T> {
  143.     public T key;
  144.     public Node<T> left, right;
  145.     public int height;
  146.  
  147.     Node(T key) {
  148.         this.key = key;
  149.         left = null;
  150.         right = null;
  151.         height = 1;
  152.     }
  153.  
  154.     Node(Node<T> node) {
  155.         this.key = node.key;
  156.         this.left = node.left;
  157.         this.right = node.right;
  158.     }
  159.  
  160.     @Override
  161.     public int compareTo(T o) {
  162.         this.compareTo(o);
  163.         return 0;
  164.     }
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement