public void Altura(NodoAVL <T> padre)
 {
     //Empieza conteo con 0
     padre.equilibrio = 0;
     padre.alturader  = 0;
     padre.alturaizq  = 0;
     if (padre.derecho.DatoNodoArbol != null)
     {
         Altura(padre.derecho);
         if (padre.derecho.DatoNodoArbol != null)
         {
             padre.alturader  = maximo(padre.derecho.alturaizq, padre.derecho.alturader) + 1;
             padre.equilibrio = VerificarBalanceo(padre);
         }
     }
     if (padre.izquierdo.DatoNodoArbol != null)
     {
         Altura(padre.izquierdo);
         if (padre.izquierdo.DatoNodoArbol != null)
         {
             padre.alturaizq  = maximo(padre.izquierdo.alturaizq, padre.izquierdo.alturader) + 1;
             padre.equilibrio = VerificarBalanceo(padre);
         }
     }
 }
        public T ValorMinimo(NodoAVL <T> padre)
        {
            T minv;

            minv = padre.DatoNodoArbol;
            while (padre.izquierdo.DatoNodoArbol != null)
            {
                minv  = padre.izquierdo.DatoNodoArbol;
                padre = padre.izquierdo;
            }
            return(minv);
        }
 public int VerificarBalanceo(NodoAVL <T> padre)
 {
     if (padre == null)
     {
         return(0);
     }
     else
     {
         int iz  = ObtenerAltura(padre.izquierdo);
         int der = ObtenerAltura(padre.derecho);
         //Factor de equilibrio
         return(iz - der);
     }
 }
 public int ObtenerAltura(NodoAVL <T> padre)
 {
     if (padre == null)
     {
         return(1);
     }
     else
     {
         int iz  = ObtenerAltura(padre.izquierdo);
         int der = ObtenerAltura(padre.derecho);
         int bal = maximo(iz, der);
         //Factor de equilibrio
         return(bal + 1);
     }
 }
 public NodoAVL <T> Eliminar(NodoAVL <T> padre, T farmaco, Delegate delegates)
 {
     if (padre.DatoNodoArbol == null)
     {
         return(padre);
     }
     if (Convert.ToInt32(delegates.DynamicInvoke(padre.DatoNodoArbol, farmaco)) == 1)
     {
         padre.izquierdo = Eliminar(padre.izquierdo, farmaco, delegates);
         if (padre.izquierdo.DatoNodoArbol != null) //verifica si hay dato para actualizar su altura
         {
             padre.alturaizq = 1 + maximo(padre.izquierdo.alturaizq, padre.izquierdo.alturader);
         }
     }
     else if (Convert.ToInt32(delegates.DynamicInvoke(padre.DatoNodoArbol, farmaco)) == -1)
     {
         padre.derecho = Eliminar(padre.derecho, farmaco, delegates);
         if (padre.derecho.DatoNodoArbol != null) //verifica si hay dato para actualizar su altura
         {
             padre.alturader = 1 + maximo(padre.derecho.alturaizq, padre.derecho.alturader);
         }
     }
     else
     {
         if (padre.izquierdo.DatoNodoArbol == null)
         {
             return(padre.derecho);
         }
         else if (padre.derecho.DatoNodoArbol == null)
         {
             return(padre.izquierdo);
         }
         else
         {
             padre.DatoNodoArbol = ValorMinimo(padre.derecho);
             padre.derecho       = Eliminar(padre.derecho, padre.DatoNodoArbol, delegates);
         }
         Altura(padre);
     }
     padre.equilibrio           = VerificarBalanceo(padre);
     padre.derecho.equilibrio   = VerificarBalanceo(padre.derecho);
     padre.izquierdo.equilibrio = VerificarBalanceo(padre.izquierdo);
     //verificar y hacer balanceo
     padre = Balancear(padre);
     //contador--;
     return(padre);
 }
 public NodoAVL <T> Balancear(NodoAVL <T> padre)
 {
     //Rotacion doble derecha
     if (VerificarBalanceo(padre) == -2 && VerificarBalanceo(padre.derecho) == 1)
     {
         NodoAVL <T> temp  = padre.derecho;
         NodoAVL <T> temp2 = temp.izquierdo;
         temp.izquierdo = temp2.derecho;
         padre.derecho  = temp2;
         temp2.derecho  = temp;
         ObtenerAltura(padre);
     }
     //Rotacion doble izquierda
     if (VerificarBalanceo(padre) == 2 && VerificarBalanceo(padre.izquierdo) == -1)
     {
         NodoAVL <T> temp  = padre.izquierdo;
         NodoAVL <T> temp2 = temp.derecho;
         temp.derecho    = temp2.izquierdo;
         padre.izquierdo = temp2;
         temp2.izquierdo = temp;
         ObtenerAltura(padre);
     }
     //Rotacion simple a la derecha
     if (VerificarBalanceo(padre) == -2)
     {
         NodoAVL <T> temp  = padre.derecho;
         NodoAVL <T> temp2 = temp.izquierdo;
         temp.izquierdo = padre;
         padre.derecho  = temp2;
         //cambia altura
         padre = temp;
         Altura(padre);
     }
     //Rotacion simple a la izquierda
     if (VerificarBalanceo(padre) == 2)
     {
         NodoAVL <T> temp  = padre.izquierdo;
         NodoAVL <T> temp2 = temp.derecho;
         temp.derecho    = padre;
         padre.izquierdo = temp2;
         //cambiaaltura
         padre = temp;
         Altura(padre);
     }
     return(padre);
 }
 //BUSQUEDA
 protected override T BuscarFarmaco(T farmaco, Delegate delegates, NodoAVL <T> padre)
 {
     if (padre.DatoNodoArbol != null)
     {
         if (Convert.ToInt32(delegates.DynamicInvoke(padre.DatoNodoArbol, farmaco)) == 1)//menor
         {
             return(BuscarFarmaco(farmaco, delegates, padre.izquierdo));
         }
         else if (Convert.ToInt32(delegates.DynamicInvoke(padre.DatoNodoArbol, farmaco)) == -1)//mayor
         {
             return(BuscarFarmaco(farmaco, delegates, padre.derecho));
         }
         else if (padre.DatoNodoArbol == null)
         {
             padre.DatoNodoArbol = farmaco;
             return(padre.DatoNodoArbol);
         }
         return(padre.DatoNodoArbol);
     }
     return(padre.DatoNodoArbol);
 }
        //AGREGAR
        protected override void AgregarArbol(T farmaco, Delegate delegates, NodoAVL <T> padre)
        {
            if (padre.DatoNodoArbol == null)
            {
                padre.DatoNodoArbol = farmaco;
                padre.izquierdo     = new NodoAVL <T>();
                padre.derecho       = new NodoAVL <T>();
                contador++;
            }
            else
            {
                if (Convert.ToInt32(delegates.DynamicInvoke(padre.DatoNodoArbol, farmaco)) == 1)
                {
                    //izquierda
                    AgregarArbol(farmaco, delegates, padre.izquierdo);

                    padre.izquierdo = Balancear(padre.izquierdo);
                    if (padre.izquierdo.DatoNodoArbol != null) //verifica si hay dato para actualizar su altura
                    {
                        padre.alturaizq = 1 + maximo(padre.izquierdo.alturaizq, padre.izquierdo.alturader);
                    }
                }
                else if (Convert.ToInt32(delegates.DynamicInvoke(padre.DatoNodoArbol, farmaco)) == -1)
                {
                    //derecho
                    AgregarArbol(farmaco, delegates, padre.derecho);
                    padre.derecho = Balancear(padre.derecho);
                    if (padre.derecho.DatoNodoArbol != null) //verifica si hay dato para actualizar su altura
                    {
                        padre.alturader = 1 + maximo(padre.derecho.alturaizq, padre.derecho.alturader);
                    }
                }
            }
            padre.equilibrio = VerificarBalanceo(padre);
            int prueba = padre.alturaizq - padre.alturader;
        }
Esempio n. 9
0
 protected abstract T BuscarFarmaco(T farmaco, Delegate delegates, NodoAVL <T> padre);
Esempio n. 10
0
 protected abstract void AgregarArbol(T farmaco, Delegate delegates, NodoAVL <T> padre);
Esempio n. 11
0
 //ELIMINAR 2
 public void EliminarFarmaco(T farmaco, Delegate delegates)
 {
     padre = Eliminar(padre, farmaco, delegates);
 }
Esempio n. 12
0
 public void AddArbol(T farmaco, Delegate delegates)
 {
     AgregarArbol(farmaco, delegates, padre);
     padre = Balancear(padre);
 }