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