Advertisement
davidcastrosalinas

20201128 ABB Parte 2 (eliminación, búsqueda, altura)

Nov 28th, 2020
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.87 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct Nodo {
  6.     int info; //key value
  7.     struct Nodo* izq;
  8.     struct Nodo* der;
  9. };
  10. typedef Nodo* AB;
  11.  
  12.  
  13.  
  14. //mostrando toda la izq y luego la derecha
  15. void preorden(AB t){
  16.     if(t == NULL)
  17.         return;
  18.     cout<<", "<<t->info;
  19.     preorden(t->izq);
  20.     preorden(t->der);
  21. }
  22.  
  23. //cómo puedo saber la cantidad de nodos que tiene el árbol?
  24. int contarNodos(AB t){
  25.     if(t == NULL)
  26.         return 0;
  27.  
  28.     return 1 + contarNodos(t->izq) + contarNodos(t->der);
  29. }
  30. void inordenAB(AB t){
  31.     if(t == NULL)
  32.             return;
  33.     inordenAB(t->izq);
  34.     cout<<", "<<t->info;
  35.     inordenAB(t->der);
  36. }
  37.  
  38. void postordenAB(AB t){
  39.     if(t == NULL)
  40.         return;
  41.     postordenAB(t->izq);
  42.     postordenAB(t->der);
  43.     cout<<", "<<t->info;
  44. }
  45. //como saber la cantidad de hojas?
  46. //hoja= sus dos hijos =  null
  47. int contarHojas(AB t){
  48.     if(t == NULL)
  49.         return 0;
  50.  
  51.     if(t->izq == NULL and t->der == NULL) //punto final
  52.         return 1;
  53.  
  54.     return contarHojas(t->izq) + contarHojas(t->der);
  55. }
  56.  
  57. int altura(AB t){
  58.     if(t == NULL)
  59.         return -1; //el arbol tiene valor 0
  60.  
  61.     //recorro por la izq y por la derecha veo el al altura mayor
  62.     int alturaizq = altura(t->izq);
  63.     int alturader = altura(t->der);
  64.     //cual de los dos es mayor
  65.     if(alturaizq > alturader)
  66.         return 1 + alturaizq;
  67.     else
  68.         return 1 + alturader;
  69. }
  70.  
  71.  
  72.  
  73. //conocer el mayor
  74.  
  75. /**Hoy revisaremos **/
  76. //cuenta nodos internos
  77. //altura
  78. //recorrido pre-in-post{Orden}
  79. /**1) Agregue la función buscar(arbol T, int elemento) que devuelva -1 si el elemento no se encuentra en el árbol y en caso de encontrarlo indique la cantidad de saltos necesarios para encontrar el elemento.
  80.  
  81. crear la clase ArbolBinario<Type>
  82.     add(value<Type>, key)
  83.     bool empty()
  84.     getKey() retorna el key de la posición actual
  85.     getValue() retorna el value de la posición actual
  86.  
  87.     viewPre()
  88.     viewIn()
  89.     viewPost()
  90.     bool exists(key)
  91.     <Type> find(key) retorna el value
  92.  
  93.     count() retorna la cantidad de elementos
  94.     height() retorna la altura
  95.     leaves() retorna la cantidad de hojas
  96.     bool remove(key) retorna true si lo pudo eliminar
  97.  
  98. **/
  99.  
  100. //Arboles binarios de búsqueda
  101. //menores a la izquierda y mayores a la derecha
  102. void insertarABB(AB &t, int info){
  103.     //crear un nodo
  104.     if(t == NULL){
  105.         t = new Nodo();
  106.         t->info= info;
  107.         t->izq = NULL;
  108.         t->der = NULL;
  109.     } else {
  110.         if(info < t->info)
  111.             insertarABB(t->izq, info);
  112.         else
  113.             insertarABB(t->der, info);
  114.     }
  115. }
  116.  
  117. int buscar(AB t, int k){
  118.     if( t == NULL)
  119.         return -1; // si el arbol viene vacio
  120.     if(t-> info == k){
  121.         return t->info;
  122.     }
  123.     else{
  124.         if(k < t->info)
  125.             return buscar(t->izq, k);
  126.         else
  127.             return buscar(t->der, k);
  128.     }
  129. }
  130.  
  131. void desplazarAlMayor(AB &s, AB &p){
  132.     if(s->der != NULL)
  133.         return desplazarAlMayor(s->der, p);
  134.  
  135.     p = s;
  136.     s = s->izq;
  137. }
  138.  
  139. bool eliminarABB(AB &t, int k){
  140.     //cuando el arbol esta vacio
  141.     if(t == NULL)
  142.         return false;
  143.  
  144.     if( t->info == k) {
  145.         AB q = t;
  146.         //si tiene un solo hijo
  147.         if(t->der == NULL)
  148.             t = t->izq; //salto al hijo
  149.         else if(t->izq == NULL)
  150.             t = t->der; //salto al hijo
  151.         else {
  152.             //tengo dos hijos
  153.             //busco el mayor elemento al lado izquierdo
  154.             desplazarAlMayor(t->izq, q);
  155.             t->info = q->info;
  156.         }
  157.         //eliminar
  158.         delete q;
  159.         return true;
  160.     } else {
  161.         //recorrido
  162.         if(k < t->info)
  163.             eliminarABB(t->izq, k);
  164.         else
  165.             eliminarABB(t->der, k);
  166.     }
  167.     //termino de recorrer el arbol y no lo encontró
  168.     //return false;
  169. }
  170.  
  171. int main()
  172. {
  173.     AB raiz = NULL;
  174.  
  175. /*    AB uno = new Nodo();
  176.     uno->info = 9;
  177.     uno->izq = NULL;
  178.     uno->der = NULL;
  179.  
  180.     AB dos = new Nodo();
  181.     dos->info=3;
  182.     dos->izq = NULL;
  183.     dos->der = NULL;
  184.  
  185.     AB tres = new Nodo();
  186.     tres->info=2;
  187.     tres->izq = NULL;
  188.     tres->der = NULL;
  189.  
  190.     AB cuatro = new Nodo();
  191.     cuatro->info=10;
  192.     cuatro->izq = NULL;
  193.     cuatro->der = NULL;
  194.  
  195.     raiz = uno;
  196.     uno->izq = dos;
  197.     dos->der = tres;
  198.     tres->izq = cuatro;
  199.  
  200.     recorrerAB(raiz);*/
  201.  
  202.  
  203.     insertarABB(raiz, 10);
  204.     insertarABB(raiz, 5);
  205.     insertarABB(raiz, 15);
  206.     insertarABB(raiz, 3);
  207.     insertarABB(raiz, 7);
  208.     insertarABB(raiz, 14);
  209.     insertarABB(raiz, 18);
  210. //    recorrerAB(raiz);
  211.  
  212.     AB raiz2 = NULL;
  213.     insertarABB(raiz2, 18);
  214.     insertarABB(raiz2, 15);
  215.     insertarABB(raiz2, 14);
  216.     insertarABB(raiz2, 10);
  217.     insertarABB(raiz2, 7);
  218.     insertarABB(raiz2, 5);
  219.     insertarABB(raiz2, 3);
  220.    // recorrerAB(raiz2);
  221.  
  222.     /*cout <<"cantidad de nodos:" <<contarNodos(raiz)<<endl;
  223.     cout <<"cantidad de hojas:" <<contarHojas(raiz)<<endl;
  224.     cout <<"Altura:" <<altura(raiz)<<endl;
  225.     cout <<"Altura2:" <<altura(raiz2)<<endl;
  226.     cout <<"inOrden:" <<endl;
  227.     inordenAB(raiz2);
  228.  
  229.     */
  230.     cout <<"\nPre:" <<endl;
  231.     preorden(raiz);
  232.     cout <<"\ninOrden:" <<endl;
  233.     inordenAB(raiz);
  234.     cout <<"\nPost:" <<endl;
  235.     postordenAB(raiz);
  236.     cout <<"\nbuscando el numero 15:\t"<<buscar(raiz,15);
  237.     cout <<"\nbuscando el numero 20:\t"<<buscar(raiz,20);
  238.  
  239.     cout <<"\neliminando 15:"<<eliminarABB(raiz, 15);
  240.     cout <<"\neliminando 20:"<<eliminarABB(raiz, 20);
  241.     cout <<"\neliminando 3:"<<eliminarABB(raiz, 3);
  242.     cout <<"\neliminando 15:"<<eliminarABB(raiz, 18);
  243.     cout <<"\neliminando 20:"<<eliminarABB(raiz, 14);
  244.     cout <<"\neliminando 3:"<<eliminarABB(raiz,7);
  245.     cout <<"\neliminando 3:"<<eliminarABB(raiz,5);
  246.     cout <<"\neliminando 3:"<<eliminarABB(raiz,10);
  247.  
  248.     cout <<"\nPre:" <<endl;
  249.     preorden(raiz);
  250.     cout << "\nHello world!" << endl;
  251.     return 0;
  252. }
  253.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement