davidcastrosalinas

20201204 Clase ABB con templates

Dec 4th, 2020
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.72 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. /**
  5. crear la clase BinaryTree<Type>
  6.     add(value<Type>, key)
  7.     bool empty()
  8.     getKey() retorna el key de la posición actual
  9.     getValue() retorna el value de la posición actual
  10.  
  11.     viewPre()  private ->preorden(raiz)
  12.     viewIn()
  13.     viewPost()
  14.     bool exists(key)
  15.     <Type> find(key) retorna el value
  16.  
  17.     count() retorna la cantidad de elementos
  18.     height() retorna la altura
  19.     leaves() retorna la cantidad de hojas
  20.     bool remove(key) retorna true si lo pudo eliminar
  21.  
  22. **/
  23.  
  24.  
  25.  
  26. template <class TypeValue, class TypeKey>
  27. class BinaryTree {
  28. public:
  29.     BinaryTree(){
  30.         root=NULL;
  31.     };
  32.  
  33.     void add(TypeValue value, TypeKey key){
  34.         insertarABB(root, value, key);
  35.     };
  36.  
  37.     void viewPre(){
  38.         preorden(root);
  39.     };
  40.  
  41.     void viewPreClass(){
  42.         preordenClass(root);
  43.     };
  44.  
  45.     int height(){
  46.         return altura(root);
  47.     }; //retorna la altura
  48.  
  49.     bool remove(TypeKey key){
  50.         return eliminarABB(root, key);
  51.     }; //retorna true si lo pudo eliminar
  52.  
  53. private:
  54.     struct Nodo {
  55.         TypeKey key; //key value
  56.         TypeValue value;
  57.         struct Nodo* izq;
  58.         struct Nodo* der;
  59.     };
  60.     typedef Nodo* AB;
  61.  
  62.     AB root; //variable raiz
  63.  
  64.     void insertarABB(AB &t, TypeValue value, TypeKey key){
  65.     //crear un nodo
  66.         if(t == NULL){
  67.             t = new Nodo();
  68.             t->value= value;
  69.             t->key= key;
  70.             t->izq = NULL;
  71.             t->der = NULL;
  72.         } else {
  73.             if(key < t->key)
  74.                 insertarABB(t->izq, value, key);
  75.             else
  76.                 insertarABB(t->der, value, key);
  77.         }
  78.     }
  79.  
  80.     void preorden(AB t){
  81.         if(t == NULL)
  82.             return;
  83.  
  84.         cout << " " << t->value;
  85.         preorden(t->izq);
  86.         preorden(t->der);
  87.     }
  88.  
  89.     //este método lo utilizaremos cuando trabajamos con clases
  90.     void preordenClass(AB t){
  91.         if(t == NULL)
  92.             return;
  93.  
  94.         cout <<" "<<t->value.toString();
  95.         preordenClass(t->izq);
  96.         preordenClass(t->der);
  97.     }
  98.  
  99.  
  100.     int altura(AB t){
  101.         if(t == NULL)
  102.             return -1; //el arbol tiene valor 0
  103.  
  104.         //recorro por la izq y por la derecha veo el al altura mayor
  105.         int alturaizq = altura(t->izq);
  106.         int alturader = altura(t->der);
  107.         //cual de los dos es mayor
  108.         if(alturaizq > alturader)
  109.             return 1 + alturaizq;
  110.         else
  111.             return 1 + alturader;
  112.     }
  113.  
  114.     void desplazarAlMayor(AB &s, AB &p){
  115.         if(s->der != NULL)
  116.             return desplazarAlMayor(s->der, p);
  117.         p = s;
  118.         s = s->izq;
  119.     }
  120.  
  121.     bool eliminarABB(AB &t, TypeKey key){
  122.         //cuando el arbol esta vacio
  123.         if(t == NULL)
  124.             return false;
  125.  
  126.         if( t->key == key) {
  127.             AB q = t;
  128.             //si tiene un solo hijo
  129.             if(t->der == NULL)
  130.                 t = t->izq; //salto al hijo
  131.             else if(t->izq == NULL)
  132.                 t = t->der; //salto al hijo
  133.             else {
  134.                 //tengo dos hijos
  135.                 //busco el mayor elemento al lado izquierdo
  136.                 desplazarAlMayor(t->izq, q);
  137.                 t->value = q->value;
  138.             }
  139.             //eliminar
  140.             delete q;
  141.             return true;
  142.         } else {
  143.             //recorrido
  144.             if(key < t->key)
  145.                 return eliminarABB(t->izq, key);
  146.             else
  147.                 return eliminarABB(t->der, key);
  148.         }
  149.     }
  150. };
  151.  
  152. class Persona {
  153. public:
  154.     Persona(int rut=0, string nombre = ""){
  155.         this->rut = rut;
  156.         this->nombre = nombre;
  157.     };
  158.  
  159.     int getRut(){
  160.         return this->rut;
  161.     };
  162.  
  163.     string getNombre(){
  164.         return nombre;
  165.     };
  166.  
  167.     //lo uso para el visualizador de preorden
  168.     string toString(){
  169.         return this->nombre;
  170.     };
  171. private:
  172.     string nombre;
  173.     int rut;
  174. };
  175.  
  176. int main() {
  177.     BinaryTree <string, int> bt;
  178.     bt.add("uno", 1);
  179.     bt.add("dos",2);
  180.  
  181.     bt.viewPre();
  182.     cout<< "Altura" << bt.height()<< endl;
  183.  
  184.     bt.remove(1);
  185.     bt.viewPre();
  186.  
  187.     /************************************/
  188.     BinaryTree <int, string> btQuijote;
  189.     btQuijote.add(1, "david");
  190.     btQuijote.add(2, "Cristobal");
  191.  
  192.     /************************************/
  193.     //con clases
  194.     BinaryTree <Persona, int> btPersonas;
  195.     Persona p1 = Persona(134321, "Juan");
  196.     btPersonas.add(p1, p1.getRut());
  197.  
  198.     Persona p2 = Persona(144321, "Maria");
  199.     btPersonas.add(p2, p2.getRut());
  200.  
  201.     btPersonas.viewPreClass();
  202.     cout<< "Altura" << btPersonas.height()<< endl;
  203.  
  204.     btPersonas.remove(1);
  205.     btPersonas.viewPreClass();
  206.  
  207.  
  208.  
  209.     return 0;
  210. }
  211.  
  212.  
Add Comment
Please, Sign In to add comment