RafaelFascio

TP5-Ejercicio7-ClaseArbol

Jun 16th, 2021 (edited)
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.00 KB | None | 0 0
  1. public class AVLTree<ELEMENT extends Comparable<ELEMENT>> {
  2.     protected class AVLNode<ELEMENT> {
  3.         public ELEMENT item;
  4.         public AVLNode<ELEMENT> left;
  5.         public AVLNode<ELEMENT> right;
  6.         public int balance;
  7.  
  8.         public AVLNode() {
  9.             this(null, null, null, 0);
  10.         }
  11.         public AVLNode(ELEMENT item) {
  12.             this(item, null, null, 0);
  13.         }
  14.         public AVLNode(ELEMENT item, AVLNode<ELEMENT> left, AVLNode<ELEMENT> right, int balance) {
  15.             this.item = item;
  16.             this.left = left;
  17.             this.right = right;
  18.             this.balance = balance;
  19.         }
  20.  
  21.         @Override
  22.         public String toString() {
  23.             return this.item.toString();
  24.         }
  25.  
  26.         // Método para propósitos académicos
  27.         public void Visit() {
  28.             System.out.printf("%s ", this.item.toString());
  29.         }
  30.     }
  31.  
  32.  
  33.  
  34.     protected AVLNode<ELEMENT> root;
  35.     protected boolean verbose;
  36.     protected int contar;
  37.  
  38.     public AVLTree() {
  39.         this.root = null;
  40.         this.verbose = false;
  41.         this.contar = 0;
  42.     }
  43.  
  44.     public boolean setVerbose(boolean verbose) {
  45.         this.verbose = verbose;
  46.         return this.verbose;
  47.     }
  48.     public int setContar(int contar){
  49.         this.contar = contar;
  50.         return this.contar;
  51.     }
  52.     public int getContar() {
  53.         return this.contar;
  54.     }
  55.  
  56.  
  57.     @Override
  58.     public String toString() {
  59.         return toString(this.root);
  60.     }
  61.     protected String toString(AVLNode<ELEMENT> root) {
  62.         StringBuilder sb = new StringBuilder();
  63.         if (root != null) {
  64.             sb.append(root.item.toString());
  65.             sb.append((root.balance < 0) ? "[-]" : (root.balance == 0) ? "[.]" : "[+]" );
  66.             if (root.left != null) {
  67.                 sb.append("(" + toString(root.left));
  68.                 if (root.right != null) {
  69.                     sb.append(", " + toString(root.right));
  70.                 }
  71.                 sb.append(")");
  72.             } else {
  73.                 if (root.right != null) {
  74.                     sb.append("(, " + toString(root.right) + ")");
  75.                 }
  76.             }
  77.         }
  78.         return sb.toString();
  79.     }
  80.  
  81.  
  82.  
  83.     public void add(ELEMENT item) {
  84.         if (this.verbose) {
  85.             System.out.printf("Agrega %s", item.toString());
  86.         }
  87.  
  88.         boolean[] change = { false };
  89.         this.root = addAVL(this.root, item, change,contar);
  90.  
  91.         if (this.verbose) {
  92.             System.out.printf("\t %s\n", this.toString());
  93.         }
  94.     }
  95.  
  96.     private AVLNode<ELEMENT> addAVL(AVLNode<ELEMENT> root, ELEMENT item, boolean[] change,int cont) {
  97.         AVLNode<ELEMENT> n1;
  98.        
  99.         if (root == null) {
  100.             root = new AVLNode<ELEMENT>(item);
  101.             change[0] = true;
  102.             return root;
  103.         }
  104.  
  105.         if (item.compareTo(root.item) < 0) {
  106.             root.left = addAVL(root.left, item, change,cont); // agrega elementos por la izquierda
  107.             if (change[0]) { // consulta si cambió el balance
  108.                 switch (root.balance) {
  109.                     case 1:
  110.                         root.balance = 0;
  111.                         change[0] = false; // se ajusta el balance
  112.                         break;
  113.                     case 0:
  114.                         root.balance = -1;
  115.                         break;
  116.                     case -1:
  117.                         n1 = root.left;
  118.                         if (n1.balance == -1) {
  119.                             root = leftleftRotation(root, n1); // rotación doble
  120.                         } else {
  121.                             root = leftrightRotation(root, n1); // rotación simple
  122.                         }
  123.                         change[0] = false; // se ajusta el balance
  124.                         contar=contar+1;
  125.                         break;
  126.                 }
  127.             }
  128.             return root;
  129.         }
  130.  
  131.         if (item.compareTo(root.item) > 0) {
  132.             root.right = addAVL(root.right, item, change,cont); // agrega elementos por la derecha
  133.             if (change[0]) { // consulta si cambió el balance
  134.                 switch (root.balance) {
  135.                     case -1:
  136.                         root.balance = 0;
  137.                         change[0] = false; // se ajusta el balance
  138.                         break;
  139.                     case 0:
  140.                         root.balance = 1;
  141.                         break;
  142.                     case 1:
  143.                         n1 = root.right;
  144.                         if (n1.balance == 1) {
  145.                             root = rightrightRotation(root, n1); // rotación simple
  146.                         } else {
  147.                             root = rightleftRotation(root, n1); // rotación doble
  148.                         }
  149.                         change[0] = false; // se ajusta el balance
  150.                         contar=contar+1;
  151.                         break;
  152.                 }
  153.             }
  154.             return root;
  155.         }
  156.         throw new RuntimeException(" ");
  157.     }
  158.  
  159.     //Rotaciones
  160.     private AVLNode<ELEMENT> leftleftRotation(AVLNode<ELEMENT> n, AVLNode<ELEMENT> n1) {
  161.         if (this.verbose) {
  162.             System.out.print(" con Rotación Simple:Izquierda Izquierda (LL)\n");
  163.         }
  164.  
  165.         n.left = n1.right;
  166.         n1.right = n;
  167.         if (n1.balance == -1) {
  168.             n.balance = 0;
  169.             n1.balance = 0;
  170.         } else {
  171.             n.balance = -1;
  172.             n1.balance = 1;
  173.         }
  174.         return n1;
  175.     }
  176.  
  177.     private AVLNode<ELEMENT> leftrightRotation(AVLNode<ELEMENT> n, AVLNode<ELEMENT> n1) {
  178.         if (this.verbose) {
  179.             System.out.print(" con Rotación Doble: Izquierda Derecha (LR)\n");
  180.         }
  181.  
  182.         AVLNode<ELEMENT> n2;
  183.         n2 = n1.right;
  184.         n.left = n2.right;
  185.         n2.right = n;
  186.         n1.right = n2.left;
  187.         n2.left = n1;
  188.         n1.balance = (n2.balance == 1) ? -1 : 0;
  189.         n.balance = (n2.balance == -1) ? 1 : 0;
  190.         n2.balance = 0;
  191.         return n2;
  192.     }
  193.  
  194.     private AVLNode<ELEMENT> rightrightRotation(AVLNode<ELEMENT> n, AVLNode<ELEMENT> n1) {
  195.         if (this.verbose) {
  196.             System.out.print(" con Rotación Simple: Derecha Derecha (RR)\n");
  197.         }
  198.  
  199.         n.right = n1.left;
  200.         n1.left = n;
  201.         if (n1.balance == 1) {
  202.             n.balance = 0;
  203.             n1.balance = 0;
  204.         } else {
  205.             n.balance = 1;
  206.             n1.balance = -1;
  207.         }
  208.         return n1;
  209.     }
  210.  
  211.  
  212.     private AVLNode<ELEMENT> rightleftRotation(AVLNode<ELEMENT> n, AVLNode<ELEMENT> n1) {
  213.         if (this.verbose) {
  214.             System.out.print(" con Rotación Doble: Derecha Izquierda (RL)\n");
  215.         }
  216.  
  217.         AVLNode<ELEMENT> n2;
  218.         n2 = n1.left;
  219.         n.right = n2.left;
  220.         n2.left = n;
  221.         n1.left = n2.right;
  222.         n2.right = n1;
  223.         n.balance = (n2.balance == 1) ? -1: 0;
  224.         n1.balance = (n2.balance == -1) ? 1 : 0;
  225.         n2.balance = 0;
  226.         return n2;
  227.     }
  228.  
  229.  
  230. }
  231.  
Add Comment
Please, Sign In to add comment