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; }
protected abstract T BuscarFarmaco(T farmaco, Delegate delegates, NodoAVL <T> padre);
protected abstract void AgregarArbol(T farmaco, Delegate delegates, NodoAVL <T> padre);
//ELIMINAR 2 public void EliminarFarmaco(T farmaco, Delegate delegates) { padre = Eliminar(padre, farmaco, delegates); }
public void AddArbol(T farmaco, Delegate delegates) { AgregarArbol(farmaco, delegates, padre); padre = Balancear(padre); }