private NodoAvl BorrarAvl(NodoAvl r, Comparador clave, Logical cambiaAltura) //throws Exception { if (r == null) { throw new Exception(" Nodo no encontrado "); } else if (clave.MenorQue(r.Dato)) { NodoAvl iz = BorrarAvl((NodoAvl)r.Izquierdo, clave, cambiaAltura); r.Izquierdo = iz; if (cambiaAltura.IsLogical) { r = Equilibrar1(r, cambiaAltura); } } else if (clave.MayorQue(r.Dato)) { NodoAvl dr = BorrarAvl((NodoAvl)r.Derecho, clave, cambiaAltura); r.Derecho = dr; if (cambiaAltura.IsLogical) { r = Equilibrar2(r, cambiaAltura); } } else // Nodo encontrado { NodoAvl q = r; // nodo a quitar del árbol if (q.Izquierdo == null) { r = (NodoAvl)q.Derecho; cambiaAltura.IsLogical = true; } else if (q.Derecho == null) { r = (NodoAvl)q.Izquierdo; cambiaAltura.IsLogical = true; } else { // tiene rama izquierda y derecha NodoAvl iz = Reemplazar(r, (NodoAvl)r.Izquierdo, cambiaAltura); r.Izquierdo = iz; if (cambiaAltura.IsLogical) { r = Equilibrar1(r, cambiaAltura); } } q = null; } return(r); }
public Object Buscar(Comparador T) { Nodo nodo = Raiz; while (nodo != null) { if (T.MenorQue(nodo.Dato)) { nodo = nodo.Izquierdo; } else if (T.MayorQue(nodo.Dato)) { nodo = nodo.Derecho; } else { return(nodo.Dato); } } return(null); }
private NodoAvl InsertarAvl(NodoAvl Raiz, Comparador dt, Logical h) //throws Exception { NodoAvl n1; if (Raiz == null) { Raiz = new NodoAvl(dt); h.IsLogical = true; NumeroClientes++; } else if (dt.MenorQue(Raiz.Dato)) { NodoAvl iz = InsertarAvl((NodoAvl)Raiz.Izquierdo, dt, h); Raiz.Izquierdo = iz; // regreso por los nodos del camino de búsqueda if (h.IsLogical) { // decrementa el fe por aumentar la altura de rama izquierda switch (Raiz.fe) { case 1: Raiz.fe = 0; h.IsLogical = false; break; case 0: Raiz.fe = -1; break; case -1: // aplicar rotación a la izquierda n1 = (NodoAvl)Raiz.Izquierdo; if (n1.fe == -1) { Raiz = RotacionIzquierdaIzquierda(Raiz, n1); } else { Raiz = RotacionIzquierdaDerecha(Raiz, n1); } h.IsLogical = false; break; } } } else if (dt.MayorQue(Raiz.Dato)) { NodoAvl dr; dr = InsertarAvl((NodoAvl)Raiz.Derecho, dt, h); Raiz.Derecho = dr; // regreso por los nodos del camino de búsqueda if (h.IsLogical) { // incrementa el fe por aumentar la altura de rama izquierda switch (Raiz.fe) { case 1: // aplicar rotación a la derecha n1 = (NodoAvl)Raiz.Derecho; if (n1.fe == +1) { Raiz = RotacionDerechaDerecha(Raiz, n1); } else { Raiz = RotacionDerechaIzquierda(Raiz, n1); } h.IsLogical = false; break; case 0: Raiz.fe = +1; break; case -1: Raiz.fe = 0; h.IsLogical = false; break; } } } else { throw new Exception("No puede haber claves repetidas "); } return(Raiz); }