コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }