示例#1
0
 public NodoArbolAVL(T value)
 {
     this.value            = value;
     this.FactorEquilibrio = 0;
     this.HijoIzquierdo    = null;
     this.HijoDerecho      = null;
 }
示例#2
0
 /// <summary>
 /// Contructor de Nodo
 /// </summary>
 /// <param name="nodeValue">Valor del Nodo</param>
 public NodoArbolAVL(T nodeValue)
 {
     value            = nodeValue;
     factorEquilibrio = 0;
     hijoIzquierdo    = null;
     hijoDerecho      = null;
 }
示例#3
0
        //Rotación Doble Derecha
        private NodoArbolAVL <T> RotacionDobleDerecha(NodoArbolAVL <T> Nodo)
        {
            NodoArbolAVL <T> Auxiliar;

            Nodo.hijoDerecho = RotacionIzquierda(Nodo.hijoDerecho);
            Auxiliar         = RotacionDerecha(Nodo);
            return(Auxiliar);
        }
示例#4
0
        //Rotación Doble Izquierda
        public NodoArbolAVL <T> RotacionDobleIzquierda(NodoArbolAVL <T> Nodo)
        {
            NodoArbolAVL <T> Auxiliar;

            Nodo.HijoIzquierdo = RotacionDerecha(Nodo.HijoIzquierdo);
            Auxiliar           = RotacionIzquierda(Nodo);
            return(Auxiliar);
        }
示例#5
0
 /// <summary>
 /// Metodo Recursivo que recorre el arbol
 /// </summary>
 /// <param name="Aux">Nodo Raiz</param>
 /// <param name="Elements">Lista de Datos en Orden</param>
 private void PostOrder(NodoArbolAVL <T> Aux, ref List <T> Elements)
 {
     if (Aux != null)
     {
         PostOrder(Aux.hijoIzquierdo, ref Elements);
         PostOrder(Aux.hijoDerecho, ref Elements);
         Elements.Add(Aux.value);
     }
 }
示例#6
0
 //Obtener Factor de Equilibrio
 private int ObtenerFactorEquilibrio(NodoArbolAVL <T> x)
 {
     if (x == null)
     {
         return(-1);
     }
     else
     {
         return(x.factorEquilibrio);
     }
 }
示例#7
0
        //Rotación Simple Derecha
        private NodoArbolAVL <T> RotacionDerecha(NodoArbolAVL <T> Nodo)
        {
            NodoArbolAVL <T> Auxiliar = Nodo.hijoDerecho;

            Nodo.hijoDerecho = Auxiliar.hijoIzquierdo;

            Auxiliar.hijoIzquierdo = Nodo;
            //Obtiene el mayor factor de equilibrio de sus hijos.
            Nodo.factorEquilibrio     = Math.Max(ObtenerFactorEquilibrio(Nodo.hijoIzquierdo), ObtenerFactorEquilibrio(Nodo.hijoDerecho)) + 1;
            Auxiliar.factorEquilibrio = Math.Max(ObtenerFactorEquilibrio(Auxiliar.hijoIzquierdo), ObtenerFactorEquilibrio(Auxiliar.hijoDerecho)) + 1;
            return(Auxiliar);
        }
示例#8
0
        public void Insertar(T value)
        {
            NodoArbolAVL <T> Nuevo = new NodoArbolAVL <T>(value);

            if (Raiz == null)
            {
                Raiz = Nuevo;
            }
            else
            {
                Raiz = InsertarAVL(Nuevo, Raiz);
            }
        }
示例#9
0
        /// <summary>
        /// Elimina un Nodo mediante sustitucion
        /// </summary>
        /// <param name="NodoAEliminar">Nodo a Eliminar </param>
        /// <returns>Nodo de Reemplazo</returns>
        private NodoArbolAVL <T> Reemplazar(NodoArbolAVL <T> NodoAEliminar)
        {
            NodoArbolAVL <T> remplazoPadre = NodoAEliminar;
            NodoArbolAVL <T> reemplazo     = NodoAEliminar;
            NodoArbolAVL <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);
        }
示例#10
0
 //Buscar
 /// <summary>
 /// Función que recibe un valor, y devuelve un nodo que contenga ese valor
 /// </summary>
 /// <param name="value"> valor a buscar </param>
 /// <param name="raiz"></param>
 /// <returns></returns>
 public NodoArbolAVL <T> Buscar(T value, NodoArbolAVL <T> raiz)
 {
     if (Raiz == null)
     {
         return(null);
     }
     else if (raiz.value.CompareTo(value) == 0)
     {
         return(raiz);
     }
     else if (raiz.value.CompareTo(value) == -1)
     {
         return(Buscar(value, raiz.HijoDerecho));
     }
     else
     {
         return(Buscar(value, raiz.HijoIzquierdo));
     }
 }
示例#11
0
 /// <summary>
 /// Constructor de Arbol
 /// </summary>
 public ArbolAVL()
 {
     Raiz       = null;
     comparador = null;
 }
示例#12
0
        public NodoArbolAVL <T> Eliminar(T valorEliminar, ref NodoArbolAVL <T> Raiz)
        {
            if (Raiz != null)
            {
                if (Raiz.value.CompareTo(valorEliminar) == -1)
                {
                    nodoE = Raiz;
                    Eliminar(valorEliminar, ref Raiz.hijoIzquierdo);
                }
                else
                {
                    if (Raiz.value.CompareTo(valorEliminar) == 1)
                    {
                        nodoE = Raiz;
                        Eliminar(valorEliminar, ref Raiz.hijoIzquierdo);
                    }
                    else
                    {
                        //Posicionado sobre el elemento a eliminar
                        NodoArbolAVL <T> NodoEliminar = Raiz;
                        if (NodoEliminar.hijoDerecho == null)
                        {
                            Raiz = NodoEliminar.hijoIzquierdo;

                            if (ObtenerFactorEquilibrio(nodoE.hijoIzquierdo) - ObtenerFactorEquilibrio(nodoE.hijoDerecho) == 2)
                            {
                                //MessageBox.Show("nodoE" + nodoE.valor.ToString());
                                if (nodoE.value.CompareTo(valorEliminar) == 1)
                                {
                                    nodoP = RotacionIzquierda(nodoE);
                                }
                                else
                                {
                                    nodoE = RotacionDerecha(nodoE);
                                }
                            }
                            if (ObtenerFactorEquilibrio(nodoE.hijoDerecho) - ObtenerFactorEquilibrio(nodoE.hijoIzquierdo) == 2)
                            {
                                if (nodoE.hijoDerecho.value.CompareTo(valorEliminar) == -1)
                                {
                                    nodoE = RotacionDerecha(nodoE);
                                }
                                else
                                {
                                    nodoE = RotacionDobleDerecha(nodoE);
                                }
                                nodoP = RotacionDerecha(nodoE);
                            }
                        }
                        else
                        {
                            if (NodoEliminar.hijoIzquierdo == null)
                            {
                                Raiz = NodoEliminar.hijoDerecho;
                            }
                            else
                            {
                                if (ObtenerFactorEquilibrio(Raiz.hijoIzquierdo) - ObtenerFactorEquilibrio(Raiz.hijoDerecho) > 0)
                                {
                                    NodoArbolAVL <T> AuxiliarNodo = null;
                                    NodoArbolAVL <T> Auxiliar     = Raiz.hijoIzquierdo;
                                    bool             Bandera      = false;
                                    while (Auxiliar.hijoDerecho != null)
                                    {
                                        AuxiliarNodo = Auxiliar;
                                        Auxiliar     = Auxiliar.hijoDerecho;
                                        Bandera      = true;
                                    }
                                    Raiz.value   = Auxiliar.value;
                                    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 (ObtenerFactorEquilibrio(Raiz.hijoDerecho) - ObtenerFactorEquilibrio(Raiz.hijoIzquierdo) > 0)
                                    {
                                        NodoArbolAVL <T> AuxiliarNodo = null;
                                        NodoArbolAVL <T> Auxiliar     = Raiz.hijoDerecho;
                                        bool             Bandera      = false;
                                        while (Auxiliar.hijoIzquierdo != null)
                                        {
                                            AuxiliarNodo = Auxiliar;
                                            Auxiliar     = Auxiliar.hijoIzquierdo;
                                            Bandera      = true;
                                        }
                                        Raiz.value   = Auxiliar.value;
                                        NodoEliminar = Auxiliar;
                                        if (Bandera == true)
                                        {
                                            AuxiliarNodo.hijoIzquierdo = Auxiliar.hijoIzquierdo;
                                        }
                                        else
                                        {
                                            Raiz.hijoDerecho = Auxiliar.hijoDerecho;
                                        }
                                    }
                                    else
                                    {
                                        if (ObtenerFactorEquilibrio(Raiz.hijoDerecho) - ObtenerFactorEquilibrio(Raiz.hijoIzquierdo) == 0)
                                        {
                                            NodoArbolAVL <T> AuxiliarNodo = null;
                                            NodoArbolAVL <T> Auxiliar     = Raiz.hijoIzquierdo;
                                            bool             Bandera      = false;
                                            while (Auxiliar.hijoDerecho != null)
                                            {
                                                AuxiliarNodo = Auxiliar;
                                                Auxiliar     = Auxiliar.hijoDerecho;
                                                Bandera      = true;
                                            }
                                            Raiz.value   = Auxiliar.value;
                                            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);
        }
示例#13
0
        //Metodo InsertarAVL
        private NodoArbolAVL <T> InsertarAVL(NodoArbolAVL <T> Nuevo, NodoArbolAVL <T> SubArbol)
        {
            NodoArbolAVL <T> NuevoPadre = SubArbol;

            if (Nuevo.value.CompareTo(SubArbol.value) == -1)
            {
                if (SubArbol.hijoIzquierdo == null)
                {
                    SubArbol.hijoIzquierdo = Nuevo;
                }
                else
                {
                    SubArbol.hijoIzquierdo = InsertarAVL(Nuevo, SubArbol.hijoIzquierdo);
                    if (ObtenerFactorEquilibrio(SubArbol.hijoIzquierdo) - ObtenerFactorEquilibrio(SubArbol.hijoDerecho) == 2)
                    {
                        if (Nuevo.value.CompareTo(SubArbol.hijoIzquierdo.value) == -1)
                        {
                            NuevoPadre = RotacionIzquierda(SubArbol);
                        }
                        else
                        {
                            NuevoPadre = RotacionDobleIzquierda(SubArbol);
                        }
                    }
                }
            }
            else if (Nuevo.value.CompareTo(SubArbol.value) == 1)
            {
                if (SubArbol.hijoDerecho == null)
                {
                    SubArbol.hijoDerecho = Nuevo;
                }
                else
                {
                    SubArbol.hijoDerecho = InsertarAVL(Nuevo, SubArbol.hijoDerecho);
                    if (ObtenerFactorEquilibrio(SubArbol.hijoDerecho) - ObtenerFactorEquilibrio(SubArbol.hijoIzquierdo) == 2)
                    {
                        if (Nuevo.value.CompareTo(SubArbol.hijoDerecho.value) == 1)
                        {
                            NuevoPadre = RotacionDerecha(SubArbol);
                        }
                        else
                        {
                            NuevoPadre = RotacionDobleDerecha(SubArbol);
                        }
                    }
                }
            }
            else
            {
                throw new System.InvalidOperationException("Nodo Duplicado");
            }
            //Actualizando Factor Equilibrio
            if (SubArbol.hijoIzquierdo == null && SubArbol.hijoDerecho != null)
            {
                SubArbol.factorEquilibrio = SubArbol.hijoDerecho.factorEquilibrio + 1;
            }
            else if (SubArbol.hijoDerecho == null && SubArbol.hijoIzquierdo != null)
            {
                SubArbol.factorEquilibrio = SubArbol.hijoIzquierdo.factorEquilibrio + 1;
            }
            else
            {
                SubArbol.factorEquilibrio = Math.Max(ObtenerFactorEquilibrio(SubArbol.hijoIzquierdo), ObtenerFactorEquilibrio(SubArbol.hijoDerecho)) + 1;
            }
            return(NuevoPadre);
        }
示例#14
0
 public ArbolAVL()
 {
     this.Raiz = null;
 }