예제 #1
0
        private NodoAVL <T> Rearmar(NodoAVL <T> raiz, NodoAVL <T> auxiliar)
        {
            NodoAVL <T> RaizAux = new NodoAVL <T>();

            if (auxiliar.izquierda != null)
            {
                RaizAux = Rearmar(auxiliar, auxiliar.izquierda);
                if (RaizAux.derecha != null)
                {
                    auxiliar.izquierda = RaizAux.derecha;
                    RaizAux.derecha    = auxiliar;
                }
                else
                {
                    auxiliar.izquierda = null;
                    RaizAux.derecha    = auxiliar;
                }
            }
            else
            {
                RaizAux = auxiliar;
            }
            RaizAux.izquierda = raiz.izquierda;
            return(RaizAux);
        }
예제 #2
0
 private void AjusteFeDerecha(ref NodoAVL <T> raiz)
 {
     if (raiz.izquierda == null && raiz.derecha == null)
     {
         raiz.Fe = 0;
         return;
     }
     else if (raiz.izquierda == null && raiz.derecha != null)
     {
         NodoAVL <T> aux = raiz.derecha;
         AjusteFeDerecha(ref aux);
         raiz.Fe = raiz.derecha.Fe + 1;
     }
     else if (raiz.izquierda != null && raiz.derecha == null)
     {
         NodoAVL <T> aux = raiz.izquierda;
         AjusteFeIzquierda(ref aux);
         raiz.Fe = raiz.izquierda.Fe + 1;
     }
     else if (raiz.izquierda != null && raiz.derecha != null)
     {
         NodoAVL <T> AuxI = raiz.izquierda;
         NodoAVL <T> AuxD = raiz.derecha;
         AjusteFeDerecha(ref AuxD);
         AjusteFeIzquierda(ref AuxI);
         raiz.Fe = Math.Max(raiz.izquierda.Fe, raiz.derecha.Fe) + 1;
     }
 }
예제 #3
0
        //Métodos de búsqueda
        public PacienteArbol BuscarNumero(string numero, ArbolAVL.Arbol <PacienteArbol> ArbolAvl)
        {
            numero.Replace(" ", "");
            long dpi = Convert.ToInt64(numero);
            NodoAVL <PacienteArbol> recorrer = ArbolAvl.raiz;
            bool encontrar = false;

            while (recorrer != null && encontrar == false)
            {
                long valor = recorrer.valor.DPI_CUI;
                if (dpi == valor)
                {
                    encontrar = true;
                }
                else
                {
                    if (dpi > recorrer.valor.DPI_CUI)
                    {
                        recorrer  = recorrer.derecha;
                        encontrar = false;
                    }
                    else
                    {
                        recorrer  = recorrer.izquierda;
                        encontrar = false;
                    }
                }
            }
            if (recorrer == null)
            {
                return(null);
            }
            return(recorrer.valor);
        }
예제 #4
0
        public NodoAVL <T> Balancear(NodoAVL <T> actual)
        {
            NodoAVL <T> raiz = actual;

            if (((CalcFe(actual.derecha)) - CalcFe(actual.izquierda)) == 2)
            {
                if (actual.izquierda != null)
                {
                    if (raiz.izquierda.izquierda == null && raiz.izquierda.derecha == null)
                    {
                        raiz = RDobleDerecha(actual);
                    }
                    else
                    {
                        raiz = RotarIzquierda(actual);
                    }
                }
                else
                {
                    if (raiz.derecha.izquierda == null && raiz.derecha.derecha == null)
                    {
                        raiz = RDobleDerecha(actual);
                    }
                    else
                    {
                        raiz = RotarIzquierda(actual);
                    }
                }
                Balancear(raiz);
            }
            else if ((CalcFe(actual.derecha) - CalcFe(actual.izquierda)) == -2)
            {
                if (actual.izquierda != null)
                {
                    if (raiz.izquierda.izquierda == null && raiz.izquierda.derecha == null)
                    {
                        raiz = RDobleIzquierda(actual);
                    }
                    else
                    {
                        raiz = RotarDerecha(actual);
                    }
                }
                else
                {
                    if (raiz.derecha.izquierda == null && raiz.derecha.derecha == null)
                    {
                        raiz = RDobleIzquierda(actual);
                    }
                    else
                    {
                        raiz = RotarDerecha(actual);
                    }
                }
                Balancear(raiz);
            }

            return(raiz);
        }
예제 #5
0
        public NodoAVL <T> RDobleDerecha(NodoAVL <T> nodo)
        {
            NodoAVL <T> aux;

            nodo.derecha = RotarIzquierda(nodo.derecha);
            aux          = RotarDerecha(nodo);

            return(aux);
        }
예제 #6
0
 public void PostOrden(NodoAVL <PacienteArbol> raiz, ref ListaDobleEnlace.ListaDoble <PacienteArbol> ListaInventario)
 {
     if (raiz != null)
     {
         PostOrden(raiz.izquierda, ref ListaInventario);
         PostOrden(raiz.derecha, ref ListaInventario);
         ListaInventario.InsertarFinal(raiz.valor);
     }
 }
예제 #7
0
 //Factor de equilibrio
 public int CalcFe(NodoAVL <T> nodo)
 {
     if (nodo == null)
     {
         return(-1);
     }
     else
     {
         return(nodo.Fe);
     }
 }
예제 #8
0
        public NodoAVL <T> RotarIzquierda(NodoAVL <T> nodo)
        {
            NodoAVL <T> aux = nodo.izquierda;

            nodo.izquierda = aux.derecha;
            aux.derecha    = nodo;

            nodo.Fe = Math.Max(CalcFe(nodo.izquierda), CalcFe(nodo.derecha)) + 1;
            aux.Fe  = Math.Max(CalcFe(aux.izquierda), nodo.Fe) + 1;

            return(aux);
        }
예제 #9
0
        public void InsertarValor(PacienteArbol valor, ArbolAVL.Arbol <PacienteArbol> Arbol)
        {
            NodoAVL <T> NuevoNodo = new NodoAVL <T>();

            NuevoNodo.valor     = valor;
            NuevoNodo.izquierda = null;
            NuevoNodo.derecha   = null;
            if (BuscarNumero(valor.DPI_CUI.ToString(), Arbol /*valor.DPI_CUI*/) != null)
            {
                return;
            }

            if (raiz == null)
            {
                raiz = NuevoNodo;
            }
            else
            {
                raiz = InsertarNodoValor(raiz, NuevoNodo);
            }
            contador++;
        }
예제 #10
0
        public PacienteArbol BuscarA(string nombre, ArbolAVL.Arbol <PacienteArbol> ArbolAvl)
        {
            NodoAVL <PacienteArbol> recorrer = ArbolAvl.raiz;

            nombre = nombre.ToLower();
            nombre.Replace(" ", "");
            bool encontrar = false;

            while (recorrer != null && encontrar == false)
            {
                string valor = recorrer.valor.Apellido.Replace(" ", "");
                valor = valor.ToLower();
                if (nombre == valor)
                {
                    encontrar = true;
                }
                else
                {
                    if (nombre.CompareTo(recorrer.valor.Apellido) > 0)
                    {
                        recorrer  = recorrer.derecha;
                        encontrar = false;
                    }
                    else
                    {
                        recorrer  = recorrer.izquierda;
                        encontrar = false;
                    }
                }
            }
            if (recorrer == null)
            {
                return(null);
            }
            return(recorrer.valor);
        }
예제 #11
0
        public void InsertarApellidos(PacienteArbol valor, ArbolAVL.Arbol <PacienteArbol> Arbol)
        {
            NodoAVL <T> NuevoNodo = new NodoAVL <T>();

            NuevoNodo.valor     = valor;
            NuevoNodo.izquierda = null;
            NuevoNodo.derecha   = null;
            if (Buscar(valor.Apellido, Arbol) != null)
            {
                raiz = InsertarNodoNombre(raiz, NuevoNodo);
                contador++;
                return;
            }

            if (raiz == null)
            {
                raiz = NuevoNodo;
            }
            else
            {
                raiz = InsertarNodoApellido(raiz, NuevoNodo);
            }
            contador++;
        }
예제 #12
0
 // constructor de la clase Nodo
 public NodoAVL()
 {
     Fe        = 0;
     derecha   = null;
     izquierda = null;
 }
예제 #13
0
 public void Delete()
 {
     raiz     = null;
     contador = 0;
 }
예제 #14
0
        private NodoAVL <T> InsertarNodoNombre(NodoAVL <T> actual, NodoAVL <T> nuevo)
        {
            NodoAVL <T> Raiz = actual;

            if (nuevo.valor.Nombre.CompareTo(actual.valor.Nombre) < 0)
            {
                if (actual.izquierda == null)
                {
                    actual.izquierda = nuevo;
                }
                else
                {
                    actual.izquierda = InsertarNodoNombre(actual.izquierda, nuevo);
                    if ((ArbolAVL.CalcFe(actual.izquierda) - ArbolAVL.CalcFe(actual.derecha)) == 2)
                    {
                        if (nuevo.valor.Nombre.CompareTo(actual.izquierda.valor.Nombre) < 0)
                        {
                            Raiz = ArbolAVL.RotarIzquierda(actual);
                        }
                        else
                        {
                            Raiz = ArbolAVL.RDobleIzquierda(actual);
                        }
                    }
                }
            }
            else if (nuevo.valor.Nombre.CompareTo(actual.valor.Nombre) > 0)
            {
                if (actual.derecha == null)
                {
                    actual.derecha = nuevo;
                }
                else
                {
                    actual.derecha = InsertarNodoNombre(actual.derecha, nuevo);
                    if ((ArbolAVL.CalcFe(actual.derecha) - ArbolAVL.CalcFe(actual.izquierda)) == 2)
                    {
                        if (nuevo.valor.Nombre.CompareTo(actual.derecha.valor.Nombre) > 0)
                        {
                            Raiz = ArbolAVL.RotarDerecha(actual);
                        }
                        else
                        {
                            Raiz = ArbolAVL.RDobleDerecha(actual);
                        }
                    }
                }
            }
            else
            {
                if (nuevo.valor.DPI_CUI < actual.valor.DPI_CUI)
                {
                    if (actual.izquierda == null)
                    {
                        actual.izquierda = nuevo;
                    }
                    else
                    {
                        actual.izquierda = InsertarNodoValor(actual.izquierda, nuevo);
                        if ((ArbolAVL.CalcFe(actual.izquierda) - ArbolAVL.CalcFe(actual.derecha)) == 2)
                        {
                            if (nuevo.valor.Nombre.CompareTo(actual.izquierda.valor.Nombre) < 0)
                            {
                                if (actual.derecha != null)
                                {
                                    if (actual.izquierda != null)
                                    {
                                        Raiz = ArbolAVL.RotarIzquierda(actual);
                                    }
                                }
                            }
                            else
                            {
                                if (actual.derecha != null)
                                {
                                    if (actual.izquierda != null)
                                    {
                                        Raiz = ArbolAVL.RDobleIzquierda(actual);
                                    }
                                }
                            }
                        }
                    }
                }
                else if (nuevo.valor.DPI_CUI > actual.valor.DPI_CUI)
                {
                    if (actual.derecha == null)
                    {
                        actual.derecha = nuevo;
                    }
                    else
                    {
                        actual.derecha = InsertarNodoValor(actual.derecha, nuevo);
                        if ((ArbolAVL.CalcFe(actual.derecha) - ArbolAVL.CalcFe(actual.izquierda)) == 2)
                        {
                            if (nuevo.valor.Nombre.CompareTo(actual.derecha.valor.Nombre) > 0)
                            {
                                if (actual.derecha != null)
                                {
                                    if (actual.izquierda != null)
                                    {
                                        Raiz = ArbolAVL.RotarDerecha(actual);
                                    }
                                }
                            }
                            else
                            {
                                if (actual.derecha != null)
                                {
                                    if (actual.izquierda != null)
                                    {
                                        Raiz = ArbolAVL.RDobleDerecha(actual);
                                    }
                                }
                            }
                        }
                    }
                }
            }

            if ((actual.izquierda == null) && (actual.derecha != null))
            {
                actual.Fe = actual.derecha.Fe + 1;
            }
            else if ((actual.derecha == null) && (actual.izquierda != null))
            {
                actual.Fe = actual.izquierda.Fe + 1;
            }
            else
            {
                actual.Fe = Math.Max(ArbolAVL.CalcFe(actual.izquierda), ArbolAVL.CalcFe(actual.derecha)) + 1;
            }

            return(Raiz);
        }
예제 #15
0
        public NodoAVL <T> DeleteNodo(NodoAVL <T> actual, NodoAVL <T> Borrar)
        {
            if (actual == null)
            {
                return(null);
            }

            if (Borrar.valor.Nombre.CompareTo(actual.valor.Nombre) < 0)
            {
                if (actual.izquierda == null)
                {
                    return(actual);
                }
                else if (actual.izquierda.valor.Nombre == Borrar.valor.Nombre)
                {
                    if (actual.izquierda.izquierda == null && actual.izquierda.derecha == null)
                    {
                        actual.izquierda = null;
                    }
                    else if (actual.izquierda.izquierda != null && actual.izquierda.derecha != null)
                    {
                        NodoAVL <T> aux = actual.izquierda;
                        aux = Rearmar(aux, aux.derecha);
                        AjusteFeDerecha(ref aux);
                        aux = ArbolAVL.Balancear(aux);
                        actual.izquierda = aux;
                    }
                    else if (actual.izquierda.izquierda != null && actual.izquierda.derecha == null)
                    {
                        actual.izquierda = actual.izquierda.izquierda;
                    }
                    else if (actual.izquierda.izquierda == null && actual.izquierda.derecha != null)
                    {
                        actual.izquierda = actual.izquierda.derecha;
                    }
                    actual = ArbolAVL.Balancear(actual);
                }
                else
                {
                    actual.izquierda = DeleteNodo(actual.izquierda, Borrar);
                }
            }
            else if (Borrar.valor.Nombre.CompareTo(actual.valor.Nombre) > 0)
            {
                if (actual.derecha == null)
                {
                    return(actual);
                }
                else if (actual.derecha.valor.Nombre == Borrar.valor.Nombre)
                {
                    if (actual.derecha.izquierda == null && actual.derecha.derecha == null)
                    {
                        actual.derecha = null;
                    }
                    else if (actual.derecha.izquierda != null && actual.derecha.derecha != null)
                    {
                        NodoAVL <T> aux = actual.derecha;
                        aux = Rearmar(aux, aux.derecha);
                        AjusteFeDerecha(ref aux);
                        aux            = ArbolAVL.Balancear(aux);
                        actual.derecha = aux;
                    }
                    else if (actual.derecha.izquierda != null && actual.derecha.derecha == null)
                    {
                        actual.derecha = actual.derecha.izquierda;
                    }
                    else if (actual.derecha.izquierda == null && actual.derecha.derecha != null)
                    {
                        actual.derecha = actual.derecha.derecha;
                    }
                    actual = ArbolAVL.Balancear(actual);
                }
                else
                {
                    actual.derecha = DeleteNodo(actual.derecha, Borrar);
                }
            }
            else if (Borrar.valor.Nombre.CompareTo(actual.valor.Nombre) == 0)
            {
                if (actual.izquierda == null && actual.derecha == null)
                {
                    return(null);
                }
                else if (actual.izquierda != null && actual.derecha != null)
                {
                    NodoAVL <T> aux = actual;
                    aux = Rearmar(aux, aux.derecha);
                    AjusteFeDerecha(ref aux);
                    aux    = ArbolAVL.Balancear(aux);
                    actual = aux;
                }
                else if (actual.izquierda.izquierda != null && actual.izquierda.derecha == null)
                {
                    actual = actual.izquierda;
                }
                else if (actual.izquierda.izquierda == null && actual.izquierda.derecha != null)
                {
                    actual = actual.derecha;
                }
                actual = ArbolAVL.Balancear(actual);
            }

            if ((actual.izquierda == null) && (actual.derecha != null))
            {
                actual.Fe = actual.derecha.Fe - 1;
            }
            else if ((actual.derecha == null) && (actual.izquierda != null))
            {
                actual.Fe = actual.izquierda.Fe - 1;
            }
            else
            {
                actual.Fe = Math.Max(ArbolAVL.CalcFe(actual.izquierda), ArbolAVL.CalcFe(actual.derecha)) + 1;
            }

            NodoAVL <T> Raiz = actual;

            return(Raiz);
        }
예제 #16
0
 public ArbolAVL()
 {
     Raiz     = null;
     Contador = 0;
 }
예제 #17
0
 //constructor
 public Arbol()
 {
     raiz     = null;
     contador = 0;
 }