private NodoAvl Equilibrar2(NodoAvl n, Logical cambiaAltura) { NodoAvl n1; switch (n.fe) { case -1: // Se aplica un tipo de rotación izquierda n1 = (NodoAvl)n.Izquierdo; if (n1.fe <= 0) { if (n1.fe == 0) { cambiaAltura.IsLogical = false; } n = RotacionIzquierdaIzquierda(n, n1); } else { n = RotacionIzquierdaDerecha(n, n1); } break; case 0: n.fe = -1; cambiaAltura.IsLogical = false; break; case +1: n.fe = 0; break; } return(n); }
private NodoAvl Reemplazar(NodoAvl n, NodoAvl act, Logical cambiaAltura) { if (act.Derecho != null) { NodoAvl d = Reemplazar(n, (NodoAvl)act.Derecho, cambiaAltura); act.Derecho = d; if (cambiaAltura.IsLogical) { act = Equilibrar2(act, cambiaAltura); } } else { n.Dato = act.Dato; n = act; act = (NodoAvl)act.Izquierdo; n = null; cambiaAltura.IsLogical = true; } return(act); }
private NodoAvl Equilibrar1(NodoAvl n, Logical cambiaAltura) { NodoAvl n1; switch (n.fe) { case -1: n.fe = 0; break; case 0: n.fe = 1; cambiaAltura.IsLogical = false; break; case +1: //se aplicar un tipo de rotación derecha n1 = (NodoAvl)n.Derecho; if (n1.fe >= 0) { if (n1.fe == 0) //la altura no vuelve a disminuir { cambiaAltura.IsLogical = false; } n = RotacionDerechaDerecha(n, n1); } else { n = RotacionDerechaIzquierda(n, n1); } break; } return(n); }
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); }