Advertisement
Guest User

binary

a guest
Apr 23rd, 2018
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.25 KB | None | 0 0
  1. #include "../include/info.h"
  2. #include "../include/cadena.h"
  3. #include "../include/binario.h"
  4.  
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <assert.h>
  9. #include <algorithm>
  10. #include <cmath>
  11.  
  12. using namespace std;
  13.  
  14. struct rep_binario {
  15.   info_t dato;
  16.   rep_binario *izq;
  17.   rep_binario *der;
  18. };
  19.  
  20. binario_t crear_binario() { return NULL; }
  21.  
  22. bool insertar_en_binario(info_t i, binario_t &b) {
  23.   if (b == NULL) {
  24.     b = new rep_binario;
  25.     b->dato = i;
  26.     b->der = b->izq = NULL;
  27.     return true;
  28.   } else if (strcmp(frase_info(i), frase_info(b->dato)) < 0) {
  29.     return insertar_en_binario(i, b->izq);
  30.   } else if (strcmp(frase_info(i), frase_info(b->dato)) > 0) {
  31.     return insertar_en_binario(i, b->der);
  32.   } else {
  33.     return false;
  34.   }
  35. }
  36.  
  37. info_t remover_mayor(binario_t &b) {
  38.   info_t res;
  39.   if (b->der == NULL) {
  40.     res = b->dato;
  41.     binario_t izq = b->izq;
  42.     delete (b);
  43.     b = izq;
  44.   } else {
  45.     res = remover_mayor(b->der);
  46.   }
  47.   return res;
  48. }
  49.  
  50. bool es_vacio_binario(binario_t b) {
  51.   return (b == NULL);
  52. }
  53.  
  54. info_t raiz(binario_t b) {
  55.   //assert(! es_vacio_binario(b));
  56.   return b->dato;
  57. }
  58.  
  59. binario_t izquierdo(binario_t b) {
  60.   //assert(! es_vacio_binario(b));
  61.   return b->izq;
  62. }
  63.  
  64. binario_t derecho(binario_t b) {
  65.   //assert(! es_vacio_binario(b));
  66.   return b->der;
  67. }
  68.  
  69. nat altura_binario(binario_t b) {
  70.   if (es_vacio_binario(b))
  71.     return 0;
  72.   else
  73.     return (1 + max(altura_binario(b->izq), altura_binario(b->der)));
  74. }
  75.  
  76. void liberar_binario(binario_t &b) {
  77.   if (!es_vacio_binario(b)) {
  78.     if (b->izq != NULL)
  79.       liberar_binario(b->izq);
  80.     if (b->der != NULL)
  81.       liberar_binario(b->der);
  82.     remover_de_binario(frase_info(b->dato), b);
  83.   }
  84. }
  85.  
  86. bool remover_de_binario(const char *t, binario_t &b) {
  87.   if (!es_vacio_binario(b)){
  88.     if (strcmp(frase_info(b->dato), t) == 0) {
  89.       if (es_vacio_binario(b->izq)) {
  90.         binario_t aux = b;
  91.         liberar_info(b->dato);
  92.         b = derecho(b);
  93.         delete aux;
  94.         return true;
  95.       }else if (es_vacio_binario(b->der)) {
  96.         binario_t aux = b;
  97.         liberar_info(b->dato);
  98.         b = izquierdo(b);
  99.         delete aux;
  100.         return true;
  101.       } else {
  102.         liberar_info(b->dato);
  103.         b->dato = remover_mayor(b->izq);
  104.         return true;
  105.       }
  106.     } else if (strcmp(t, frase_info(b->dato)) < 0)
  107.         return remover_de_binario(t, b->izq);
  108.      else
  109.         return remover_de_binario(t, b->der);
  110.   } else
  111.     return false;
  112. }
  113.  
  114. binario_t buscar_subarbol(const char *t, binario_t b) {
  115.   if (!es_vacio_binario(b)) {
  116.     if (strcmp(t, frase_info(b->dato)) == 0) {
  117.       return b;
  118.     } else if (strcmp(t, frase_info(b->dato)) < 0) {
  119.       return buscar_subarbol(t, b->izq);
  120.     } else {
  121.       return buscar_subarbol(t, b->der);
  122.     }
  123.   } else {
  124.     return crear_binario();
  125.   }
  126. }
  127.  
  128. nat cantidad_binario(binario_t b) {
  129.   if (es_vacio_binario(b))
  130.     return 0;
  131.   else
  132.     return (1 + cantidad_binario(b->izq) + cantidad_binario(b->der));
  133. }
  134.  
  135. info_t kesimo_en_binario(nat k, binario_t b) {
  136.   assert((1 <= k) && (k <= cantidad_binario(b)));
  137.   if (k == cantidad_binario(b->izq) + 1)
  138.       return b->dato;
  139.   else if( k <= cantidad_binario(b->izq))
  140.       return (kesimo_en_binario(k,b->izq));
  141.   else
  142.       return (kesimo_en_binario(k-1-cantidad_binario(b->izq),b->der));
  143. }
  144.  
  145. cadena_t linealizacion(binario_t b) {
  146.   cadena_t res = crear_cadena();
  147.   for (nat i = 1; i <= cantidad_binario(b); i++) {
  148.     insertar_al_final(kesimo_en_binario(i, b), res);
  149.   }
  150.   return res;
  151. }
  152.  
  153. binario_t filtrado(int clave, binario_t b) {
  154.   if (es_vacio_binario(b))
  155.     return NULL;
  156.   else {
  157.     binario_t fizq, fder, nuevo, mayor;
  158.     fizq = filtrado(clave, izquierdo(b));
  159.     fder = filtrado(clave, derecho(b));
  160.     if (numero_info(raiz(b)) < clave) {
  161.       nuevo = new rep_binario;
  162.       nuevo->dato = copia_info(raiz(b));
  163.       nuevo->izq = fizq;
  164.       nuevo->der = fder;
  165.       return nuevo;
  166.     } else if (fizq == NULL)
  167.         return fder;
  168.       else if (fder == NULL)
  169.         return fizq;
  170.       else {
  171.         mayor = new rep_binario;
  172.         mayor->dato = remover_mayor(fizq);
  173.         mayor->izq = fizq;
  174.         mayor->der = fder;
  175.         return mayor;
  176.       }
  177.   }
  178. }
  179.  
  180. static nat busqueda_altura(const char *t, binario_t b){
  181.     if (strcmp(t,frase_info(b->dato))==0)
  182.         return 0;
  183.     else if (strcmp(t,frase_info(b->dato))<0)
  184.         return (1+ busqueda_altura(t,b->izq));
  185.     else
  186.         return(1+busqueda_altura(t,b->der));
  187. }
  188.  
  189.  
  190. void imprimir_binario(binario_t b) {
  191.   if (!es_vacio_binario(b)) {
  192.     for (nat i = cantidad_binario(b); i >= 1; i--) {
  193.         printf("\n");
  194.       for (nat j = 1; j <= busqueda_altura(frase_info(kesimo_en_binario(i,b)),b); j++) {
  195.         printf("-");
  196.       }
  197.       printf("%s", info_a_texto(kesimo_en_binario(i, b)));
  198.     }
  199.   }
  200.   printf("\n");
  201. }
  202.  
  203. static int dfs(binario_t b){
  204.     int r1 = 0, r2 = 0;
  205.     if (b->izq)
  206.         r1 = dfs(b->izq);
  207.     if (b->der)
  208.         r2 = dfs(b->der);
  209.     if(r1==-1||r2==-1)
  210.         return -1;
  211.     if(abs(r1-r2)<2)
  212.         return max(r1,r2);
  213.     else
  214.         return -1;
  215. }
  216.  
  217.  
  218. bool es_AVL(binario_t b) {
  219.   if (es_vacio_binario(b))
  220.     return true;
  221.   else
  222.       return (dfs(b) != -1);
  223.  
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement