Beispiel #1
0
 public NodoAVL(T valor)
 {
     this.Valor          = valor;
     this.FactorBalanceo = 0;
     this.HijoIzquierdo  = null;
     this.HijoDerecho    = null;
 }
Beispiel #2
0
        //Rotación Doble Derecha
        public NodoAVL <T> RotacionDobleDerecha(NodoAVL <T> Nodo)
        {
            NodoAVL <T> Auxiliar;

            Nodo.HijoDerecho = RotacionIzquierda(Nodo.HijoDerecho);
            Auxiliar         = RotacionDerecha(Nodo);
            return(Auxiliar);
        }
Beispiel #3
0
 private void PostOrder(NodoAVL <T> Aux, ref List <T> Elements)
 {
     if (Aux != null)
     {
         PostOrder(Aux.HijoIzquierdo, ref Elements);
         PostOrder(Aux.HijoDerecho, ref Elements);
         Elements.Add(Aux.Valor);
     }
 }
Beispiel #4
0
 public int Balancear(NodoAVL <T> x)
 {
     if (x == null)
     {
         return(-1);
     }
     else
     {
         return(x.FactorBalanceo);
     }
 }
Beispiel #5
0
        //Rotación Simple Derecha
        public NodoAVL <T> RotacionDerecha(NodoAVL <T> Nodo)
        {
            NodoAVL <T> Auxiliar = Nodo.HijoDerecho;

            Nodo.HijoDerecho = Auxiliar.HijoIzquierdo;

            Auxiliar.HijoIzquierdo = Nodo;
            //Obtiene el mayor factor de equilibrio de sus hijos.
            Nodo.FactorBalanceo     = Math.Max(Balancear(Nodo.HijoIzquierdo), Balancear(Nodo.HijoDerecho)) + 1;
            Auxiliar.FactorBalanceo = Math.Max(Balancear(Auxiliar.HijoIzquierdo), Balancear(Auxiliar.HijoDerecho)) + 1;
            return(Auxiliar);
        }
Beispiel #6
0
        public void Insertar(T value)
        {
            NodoAVL <T> Nuevo = new NodoAVL <T>(value);

            if (Raiz == null)
            {
                Raiz = Nuevo;
            }
            else
            {
                Raiz = InsertarHijos(Nuevo, Raiz);
            }
        }
Beispiel #7
0
        private NodoAVL <T> Reemplazar(NodoAVL <T> NodoAEliminar)
        {
            NodoAVL <T> remplazoPadre = NodoAEliminar;
            NodoAVL <T> reemplazo     = NodoAEliminar;
            NodoAVL <T> auxiliar      = NodoAEliminar.HijoDerecho;

            while (auxiliar != null)
            {
                remplazoPadre = reemplazo;
                reemplazo     = auxiliar;
                auxiliar      = auxiliar.HijoIzquierdo;
            }
            if (reemplazo != NodoAEliminar.HijoDerecho)
            {
                remplazoPadre.HijoIzquierdo = reemplazo.HijoDerecho;
                reemplazo.HijoDerecho       = NodoAEliminar.HijoDerecho;
            }
            return(reemplazo);
        }
Beispiel #8
0
 public NodoAVL <T> Buscar(T value, NodoAVL <T> raiz)
 {
     if (Raiz == null)
     {
         return(null);
     }
     else if (raiz.Valor.CompareTo(value) == 0)
     {
         return(raiz);
     }
     else if (raiz.Valor.CompareTo(value) == -1)
     {
         return(Buscar(value, raiz.HijoDerecho));
     }
     else
     {
         return(Buscar(value, raiz.HijoIzquierdo));
     }
 }
Beispiel #9
0
        //Metodo InsertarHijos
        public NodoAVL <T> InsertarHijos(NodoAVL <T> Nuevo, NodoAVL <T> SubArbol)
        {
            NodoAVL <T> NuevoPadre = SubArbol;

            if (Nuevo.Valor.CompareTo(SubArbol.Valor) == -1)
            {
                if (SubArbol.HijoIzquierdo == null)
                {
                    SubArbol.HijoIzquierdo = Nuevo;
                }
                else
                {
                    SubArbol.HijoIzquierdo = InsertarHijos(Nuevo, SubArbol.HijoIzquierdo);
                    if (Balancear(SubArbol.HijoIzquierdo) - Balancear(SubArbol.HijoDerecho) == 2)
                    {
                        if (Nuevo.Valor.CompareTo(SubArbol.HijoIzquierdo.Valor) == -1)
                        {
                            NuevoPadre = RotacionIzquierda(SubArbol);
                        }
                        else
                        {
                            NuevoPadre = RotacionDobleIzquierda(SubArbol);
                        }
                    }
                }
            }
            else if (Nuevo.Valor.CompareTo(SubArbol.Valor) == 1)
            {
                if (SubArbol.HijoDerecho == null)
                {
                    SubArbol.HijoDerecho = Nuevo;
                }
                else
                {
                    SubArbol.HijoDerecho = InsertarHijos(Nuevo, SubArbol.HijoDerecho);
                    if (Balancear(SubArbol.HijoDerecho) - Balancear(SubArbol.HijoIzquierdo) == 2)
                    {
                        if (Nuevo.Valor.CompareTo(SubArbol.HijoDerecho.Valor) == 1)
                        {
                            NuevoPadre = RotacionDerecha(SubArbol);
                        }
                        else
                        {
                            NuevoPadre = RotacionDobleDerecha(SubArbol);
                        }
                    }
                }
            }
            else
            {
                //Nodo con un factor de ordenamiento ya existente
            }


            //Actualizando Factor Equilibrio
            if (SubArbol.HijoIzquierdo == null && SubArbol.HijoDerecho != null)
            {
                SubArbol.FactorBalanceo = SubArbol.HijoDerecho.FactorBalanceo + 1;
            }
            else if (SubArbol.HijoDerecho == null && SubArbol.HijoIzquierdo != null)
            {
                SubArbol.FactorBalanceo = SubArbol.HijoIzquierdo.FactorBalanceo + 1;
            }
            else
            {
                SubArbol.FactorBalanceo = Math.Max(Balancear(SubArbol.HijoIzquierdo), Balancear(SubArbol.HijoDerecho)) + 1;
            }
            return(NuevoPadre);
        }
Beispiel #10
0
 public NodoAVL <T> Eliminar(T valorEliminar, ref NodoAVL <T> Raiz)
 {
     if (Raiz != null)
     {
         if (Raiz.Valor.CompareTo(valorEliminar) == -1)
         {
             nodoE = Raiz;
             Eliminar(valorEliminar, ref Raiz.HijoIzquierdo);
         }
         else
         {
             if (Raiz.Valor.CompareTo(valorEliminar) == 1)
             {
                 nodoE = Raiz;
                 Eliminar(valorEliminar, ref Raiz.HijoIzquierdo);
             }
             else
             {
                 //Posicionado sobre el elemento a eliminar
                 NodoAVL <T> NodoEliminar = Raiz;
                 if (NodoEliminar.HijoDerecho == null)
                 {
                     Raiz = NodoEliminar.HijoIzquierdo;
                     if (Balancear(nodoE.HijoIzquierdo) - Balancear(nodoE.HijoDerecho) == 2)
                     {
                         if (nodoE.Valor.CompareTo(valorEliminar) == 1)
                         {
                             nodoP = RotacionIzquierda(nodoE);
                         }
                         else
                         {
                             nodoE = RotacionDerecha(nodoE);
                         }
                     }
                     if (Balancear(nodoE.HijoDerecho) - Balancear(nodoE.HijoIzquierdo) == 2)
                     {
                         if (nodoE.HijoDerecho.Valor.CompareTo(valorEliminar) == -1)
                         {
                             nodoE = RotacionDerecha(nodoE);
                         }
                         else
                         {
                             nodoE = RotacionDobleDerecha(nodoE);
                         }
                         nodoP = RotacionDerecha(nodoE);
                     }
                 }
                 else
                 {
                     if (NodoEliminar.HijoIzquierdo == null)
                     {
                         Raiz = NodoEliminar.HijoDerecho;
                     }
                     else
                     {
                         if (Balancear(Raiz.HijoIzquierdo) - Balancear(Raiz.HijoDerecho) > 0)
                         {
                             NodoAVL <T> AuxiliarNodo = null;
                             NodoAVL <T> Auxiliar     = Raiz.HijoIzquierdo;
                             bool        Bandera      = false;
                             while (Auxiliar.HijoDerecho != null)
                             {
                                 AuxiliarNodo = Auxiliar;
                                 Auxiliar     = Auxiliar.HijoDerecho;
                                 Bandera      = true;
                             }
                             Raiz.Valor   = Auxiliar.Valor;
                             NodoEliminar = Auxiliar;
                             if (Bandera == true)
                             {
                                 AuxiliarNodo.HijoDerecho = Auxiliar.HijoIzquierdo;
                             }
                             else
                             {
                                 Raiz.HijoIzquierdo = Auxiliar.HijoIzquierdo;
                             }
                             //Realiza las rotaciones simples o dobles segun el caso
                         }
                         else
                         {
                             if (Balancear(Raiz.HijoDerecho) - Balancear(Raiz.HijoIzquierdo) > 0)
                             {
                                 NodoAVL <T> AuxiliarNodo = null;
                                 NodoAVL <T> Auxiliar     = Raiz.HijoDerecho;
                                 bool        Bandera      = false;
                                 while (Auxiliar.HijoIzquierdo != null)
                                 {
                                     AuxiliarNodo = Auxiliar;
                                     Auxiliar     = Auxiliar.HijoIzquierdo;
                                     Bandera      = true;
                                 }
                                 Raiz.Valor   = Auxiliar.Valor;
                                 NodoEliminar = Auxiliar;
                                 if (Bandera == true)
                                 {
                                     AuxiliarNodo.HijoIzquierdo = Auxiliar.HijoIzquierdo;
                                 }
                                 else
                                 {
                                     Raiz.HijoDerecho = Auxiliar.HijoDerecho;
                                 }
                             }
                             else
                             {
                                 if (Balancear(Raiz.HijoDerecho) - Balancear(Raiz.HijoIzquierdo) == 0)
                                 {
                                     NodoAVL <T> AuxiliarNodo = null;
                                     NodoAVL <T> Auxiliar     = Raiz.HijoIzquierdo;
                                     bool        Bandera      = false;
                                     while (Auxiliar.HijoDerecho != null)
                                     {
                                         AuxiliarNodo = Auxiliar;
                                         Auxiliar     = Auxiliar.HijoDerecho;
                                         Bandera      = true;
                                     }
                                     Raiz.Valor   = Auxiliar.Valor;
                                     NodoEliminar = Auxiliar;
                                     if (Bandera == true)
                                     {
                                         AuxiliarNodo.HijoDerecho = Auxiliar.HijoDerecho;
                                     }
                                     else
                                     {
                                         Raiz.HijoIzquierdo = Auxiliar.HijoIzquierdo;
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     else
     {
         throw new System.InvalidOperationException("Nodo inexistente en el arbol");
     }
     return(nodoP);
 }
Beispiel #11
0
 public ArbolAVL()
 {
     this.Raiz = null;
 }