Пример #1
0
        private NodoAvl rotacionDI(NodoAvl n, NodoAvl n1)
        {
            NodoAvl n2;

            n2 = (NodoAvl)n1.subarbolIzq();
            n.ramaDch(n2.subarbolIzq());
            n2.ramaIzq(n);
            n1.ramaIzq(n2.subarbolDch());
            n2.ramaDch(n1);
            // factores de equilibrio en actualizacion
            if (n2.fe == +1)
            {
                n.fe = -1;
            }
            else
            {
                n.fe = 0;
            }
            if (n2.fe == -1)
            {
                n1.fe = 1;
            }
            else
            {
                n1.fe = 0;
            }
            n2.fe = 0;
            return(n2);
        }
Пример #2
0
        private NodoAvl rotacionID(NodoAvl n, NodoAvl n1)
        {
            NodoAvl n2;

            n2 = (NodoAvl)n1.subarbolDch();
            n.ramaIzq(n2.subarbolDch());
            n2.ramaDch(n);
            n1.ramaDch(n2.subarbolIzq());
            n2.ramaIzq(n1);
            // Se actualizan para la equilibracion
            if (n2.fe == +1)
            {
                n1.fe = -1;
            }
            else
            {
                n1.fe = 0;
            }
            if (n2.fe == -1)
            {
                n.fe = 1;
            }
            else
            {
                n.fe = 0;
            }
            n2.fe = 0;
            return(n2);
        }
Пример #3
0
 private static NodoAvl GetItemInterno(NodoAvl arbol, T valor)
 {
     if (arbol != null)
     {
         int t = arbol.Valor.CompareTo(valor);
         if (t == 0)
         {
             return(arbol);
         }
         else if (t > 0 && arbol.HijoDercho != null)
         {
             return(GetItemInterno(arbol.HijoDercho, valor));
         }
         else if (t < 0 && arbol.HijoIzq != null)
         {
             return(GetItemInterno(arbol.HijoIzq, valor));
         }
         else
         {
             return(null);
         }
     }
     else
     {
         return(null);
     }
 }
Пример #4
0
        public void insertar(Object valor)
        {
            Comparador dato;
            Logical    h = new Logical(false);           // Aca utlizamos la clase logical y for defecto falso

            dato      = (Comparador)valor;               //El comprador que nos ayudara a comprar datos del arbol
            arbolRaiz = insertarAvl(arbolRaiz, dato, h); //metodo recursivo para la insercion de los datos
        }
Пример #5
0
        private void SubeEnInsercion(NodoAvl hijo)
        {
            NodoAvl t = hijo;

            if (t.Padre != null)
            {
                t.Padre.ReCalcula();
                if (t.Padre.Balance == 0 || t.Padre.balPrev == t.Padre.Balance)
                {
                    return;
                }
                t = t.Padre;
                while (t.Padre != null)
                {
                    t.Padre.ReCalcula();
                    if ((t.Padre.Balance == 0) || (t.Padre.Balance == t.Padre.balPrev))//si no afecto el balance
                    {
                        return;
                    }
                    else if (((t.Padre.Balance <= -2) || (t.Padre.Balance >= 2)) && ((t.Padre.balPrev >= 1) || (t.Padre.balPrev <= -1)))
                    {
                        //situacion de desbalance
                        if (t.Padre.Balance <= -2 && t.Balance <= -1)
                        {
                            t = RotaIII(t.Padre);
                        }
                        else if (t.Padre.Balance <= -2 && t.Balance >= 1)
                        {
                            t = RotaIID(t.Padre);
                        }
                        else if (t.Padre.Balance >= 2 && t.Balance >= 1)
                        {
                            t = RotaDDD(t.Padre);
                        }
                        else if (t.Padre.Balance >= 2 && t.Balance <= -1)
                        {
                            t = RotaDDI(t.Padre);
                        }

                        if (t.Padre == null)
                        {
                            raiz = t;
                        }
                        return;
                    }
                    t = t.Padre;
                }
            }
        }
Пример #6
0
        private static NodoAvl RotaDDI(NodoAvl r)
        {
            /*    r
             *     \
             *      x
             *     /
             *    w
             */
            NodoAvl x = r.HijoDercho;
            NodoAvl w = x.HijoIzq;

            x.HijoIzq = w.HijoDercho;
            if (x.HijoIzq != null)
            {
                x.HijoIzq.Padre = x;
            }

            r.HijoDercho = w.HijoIzq;
            if (r.HijoDercho != null)
            {
                r.HijoDercho.Padre = r;
            }

            w.HijoIzq    = r;
            w.HijoDercho = x;
            w.Padre      = r.Padre;
            x.Padre      = w;
            r.Padre      = w;
            if (w.Padre != null)
            {
                if (w.Valor.CompareTo(w.Padre.Valor) > 0)
                {
                    w.Padre.HijoIzq = w;
                }
                else
                {
                    w.Padre.HijoDercho = w;
                }
            }

            x.ReCalcula();
            r.ReCalcula();
            w.ReCalcula();
            if (w.Padre != null)
            {
                w.Padre.ReCalcula();
            }
            return(w);
        }
Пример #7
0
        private void RecorreInOrderByLeft(ref int index, ref T[] array, NodoAvl arbol)
        {
            if (arbol.HijoIzq != null)
            {
                RecorreInOrderByLeft(ref index, ref array, arbol.HijoIzq);
            }

            array[index] = arbol.Valor;
            index++;

            if (arbol.HijoDercho != null)
            {
                RecorreInOrderByLeft(ref index, ref array, arbol.HijoDercho);
            }
        }
Пример #8
0
 private NodoAvl rotacionDD(NodoAvl n, NodoAvl n1)
 {
     n.ramaDch(n1.subarbolIzq());
     n1.ramaIzq(n);
     // Verifica que que el arbol este en equilibrio
     if (n1.fe == +1) // de ser asi se cumplira esta funcion
     {
         n.fe  = 0;
         n1.fe = 0;
     }
     else
     {
         n.fe  = +1;//De lo contrario hara una rotacion derecha,derecha
         n1.fe = -1;
     }
     return(n1);
 }
Пример #9
0
 private static NodoAvl GetMenorInterno(NodoAvl arbol)
 {
     if (arbol != null)
     {
         if (arbol.HijoDercho != null)
         {
             return(GetMenorInterno(arbol.HijoDercho));
         }
         else
         {
             return(arbol);
         }
     }
     else
     {
         return(null);
     }
 }
Пример #10
0
        public bool Insert(T item)
        {
            NodoAvl t = AddInterno(raiz, item);


            if (t != null && raiz == null)
            {
                raiz = t;
            }
            else if (t == null)
            {
                return(false);
            }

            count++;
            SubeEnInsercion(t);
            return(true);
        }
Пример #11
0
 private static NodoAvl GetMayorInterno(NodoAvl arbol)
 {
     if (arbol != null)
     {
         if (arbol.HijoIzq != null)
         {
             return(GetMayorInterno(arbol.HijoIzq));
         }
         else
         {
             return(arbol);
         }
     }
     else
     {
         return(null);
     }
 }
Пример #12
0
 /// <summary>
 /// Devuelve el Nodo Despues que se inserto
 /// </summary>
 /// <param name="valor"></param>
 /// <returns></returns>
 private static NodoAvl AddInterno(NodoAvl arbol, T valor)
 {
     if (arbol != null)
     {
         int t = arbol.Valor.CompareTo(valor);
         if (t < 0)
         {
             if (arbol.HijoIzq == null)
             {
                 arbol.HijoIzq       = new NodoAvl(valor);
                 arbol.HijoIzq.Padre = arbol;
                 return(arbol.HijoIzq);
             }
             else
             {
                 return(AddInterno(arbol.HijoIzq, valor));
             }
         }
         else if (t > 0)
         {
             if (arbol.HijoDercho == null)
             {
                 arbol.HijoDercho       = new NodoAvl(valor);
                 arbol.HijoDercho.Padre = arbol;
                 return(arbol.HijoDercho);
             }
             else
             {
                 return(AddInterno(arbol.HijoDercho, valor));
             }
         }
         else
         {
             return(null);
         }
         //no se modifican la altura y fb del padre
     }
     else
     {
         return(new NodoAvl(valor));
     }
 }
Пример #13
0
        private IEnumerable <T> RecorreInOrderByLeft(NodoAvl arbol)
        {
            if (arbol.HijoIzq != null)
            {
                foreach (T var in RecorreInOrderByLeft(arbol.HijoIzq))
                {
                    yield return(var);
                }
            }

            yield return(arbol.Valor);

            if (arbol.HijoDercho != null)
            {
                foreach (T var in RecorreInOrderByLeft(arbol.HijoDercho))
                {
                    yield return(var);
                }
            }
        }
Пример #14
0
        public void vitacoraArbol(int valEquilibrio, string rotacionArbol, NodoAvl miArbol)
        {
            int contado = 0;

            TextWriter escribirDato = new StreamWriter("Vitacora.txt", true);

            string nuevo = ArbolAvl.rcPreorden(miArbol);

            string[] palabras = nuevo.Split(',', ';');
            string   variable = "";

            foreach (string palabra in palabras)
            {
                contado++;
                if (palabra != "" && contado % 2 == 0)
                {
                    variable = variable + " -- " + palabra;
                }
            }
            escribirDato.WriteLine(variable + "-> " + rotacionArbol + "-> " + valEquilibrio);
            escribirDato.Close();
        }
Пример #15
0
 private static bool EstaInterno(NodoAvl arbol, T valor)
 {
     if (arbol == null)
     {
         return(false);
     }
     else
     {
         int t = arbol.Valor.CompareTo(valor);
         if (t < 0)
         {
             return(EstaInterno(arbol.HijoIzq, valor));
         }
         else if (t > 0)
         {
             return(EstaInterno(arbol.HijoDercho, valor));
         }
         else
         {
             return(true);
         }
     }
 }
Пример #16
0
        private static NodoAvl RotaDDD(NodoAvl r)
        {
            /*       r
             *        \
             *         x
             *          \
             *           w
             */
            NodoAvl x = r.HijoDercho;

            r.HijoDercho = x.HijoIzq;
            if (r.HijoDercho != null)
            {
                r.HijoDercho.Padre = r;                      //imp
            }
            x.HijoIzq = r;
            x.Padre   = r.Padre;
            r.Padre   = x;
            if (x.Padre != null)
            {
                if (x.Valor.CompareTo(x.Padre.Valor) > 0)
                {
                    x.Padre.HijoIzq = x;
                }
                else
                {
                    x.Padre.HijoDercho = x;
                }
            }
            r.ReCalcula();
            x.ReCalcula();
            if (x.Padre != null)
            {
                x.Padre.ReCalcula();
            }
            return(x);
        }
Пример #17
0
        private void SubeEnEliminacion(NodoAvl hijo)
        {
            NodoAvl t = hijo;

            t.ReCalcula();
            do
            {
                if (t.balPrev == 0 && (t.Balance == -1 || t.Balance == 1))
                {
                    break;
                }
                else if (t.Balance == -2 || t.Balance == 2)
                {
                    if (t.Balance == -2)
                    {
                        if (t.HijoIzq.Balance == 0)
                        {
                            t = RotaIII(t);
                            if (t.Padre == null)
                            {
                                raiz = t;
                            }
                            break;
                        }
                        else if (t.HijoIzq.Balance == -1)
                        {
                            t = RotaIII(t);
                            if (t.Padre == null)
                            {
                                raiz = t;
                                break;
                            }
                            t = t.Padre;
                            continue;//no tengo que recalcularlo pq lo hago en la rotacion
                        }
                        else if (t.HijoIzq.Balance == 1)
                        {
                            t = RotaIID(t);
                            if (t.Padre == null)
                            {
                                raiz = t;
                                break;
                            }
                            t = t.Padre;
                            continue;
                        }
                    }
                    else if (t.Balance == 2)
                    {
                        if (t.HijoDercho.Balance == 0)
                        {
                            t = RotaDDD(t);
                            if (t.Padre == null)
                            {
                                raiz = t;
                            }
                            break;
                        }
                        else if (t.HijoDercho.Balance == 1)
                        {
                            t = RotaDDD(t);
                            if (t.Padre == null)
                            {
                                raiz = t;
                                break;
                            }
                            t = t.Padre;
                            continue;
                        }
                        else if (t.HijoDercho.Balance == -1)
                        {
                            t = RotaDDI(t);
                            if (t.Padre == null)
                            {
                                raiz = t;
                                break;
                            }
                            t = t.Padre;
                            continue;
                        }
                    } //else
                }     //else bal=2 V bal=-2
                else
                {
                    if (t.Padre != null)
                    {
                        t = t.Padre;
                        t.ReCalcula();
                    }
                    else
                    {
                        break;
                    }
                }
            } while (true);
        }
Пример #18
0
 public ArbolAvl()
 {
     arbolRaiz = null;
 }
Пример #19
0
 public Avl()
 {
     count = 0;
     raiz  = null;
 }
Пример #20
0
        private NodoAvl EliminaRetornaNodoCritico(T item)
        {
            if (raiz == null)
            {
                throw new InvalidOperationException("Arbol vacio");
            }
            if (!Contains(item))
            {
                throw new InvalidOperationException("No se contiene el elemento");
            }
            count--;
            NodoAvl toRet;
            NodoAvl toDel = GetItemInterno(raiz, item);

            if (toDel.HijoIzq == null && toDel.HijoDercho == null)
            {
                toRet = toDel.Padre;
                if (toRet == null)
                {
                    raiz = null; return(null);
                }
                else
                {
                    int t = toDel.Valor.CompareTo(toDel.Padre.Valor);
                    if (t < 0)
                    {
                        toDel.Padre.HijoDercho = null;
                    }
                    else
                    {
                        toDel.Padre.HijoIzq = null;
                    }
                    toDel.Padre = null;
                    return(toRet);
                }
            }
            else if ((toDel.HijoIzq == null && toDel.HijoDercho != null) || (toDel.HijoIzq != null && toDel.HijoDercho == null))
            {
                NodoAvl toDelHijo = toDel.HijoDercho == null ? toDel.HijoIzq : toDel.HijoDercho;
                toRet = toDel.Padre;
                if (toRet == null)
                {
                    toDelHijo.Padre  = null;
                    raiz             = toDelHijo;
                    toDel.HijoDercho = null; toDel.HijoIzq = null;
                    return(toRet);
                }
                else
                {
                    int t = toDel.Valor.CompareTo(toDel.Padre.Valor);
                    if (t < 0)
                    {
                        toDel.Padre.HijoDercho = toDelHijo;
                        toDelHijo.Padre        = toDel.Padre;
                        toDel.Padre            = null;
                        toDel.HijoDercho       = null; toDel.HijoIzq = null;
                        return(toRet);
                    }
                    else
                    {
                        toDel.Padre.HijoIzq = toDelHijo;
                        toDelHijo.Padre     = toDel.Padre;
                        toDel.Padre         = null;
                        toDel.HijoDercho    = null; toDel.HijoIzq = null;
                        return(toRet);
                    }
                }//else del padre null
            }
            else
            {
                NodoAvl menorDeMayores = GetMenorInterno(toDel.HijoIzq);
                if (menorDeMayores.HijoIzq == null)
                {
                    toDel.Valor = menorDeMayores.Valor;
                    toRet       = menorDeMayores.Padre;
                    if (menorDeMayores.Valor.CompareTo(menorDeMayores.Padre.Valor) < 0)
                    {
                        menorDeMayores.Padre.HijoDercho = null;
                    }
                    else
                    {
                        menorDeMayores.Padre.HijoIzq = null;
                    }
                    menorDeMayores.Padre = null;
                    return(toRet);
                }
                else
                {
                    toDel.Valor = menorDeMayores.Valor;
                    toRet       = menorDeMayores.Padre;
                    if (menorDeMayores.Valor.CompareTo(menorDeMayores.Padre.Valor) < 0)
                    {
                        menorDeMayores.Padre.HijoDercho = menorDeMayores.HijoIzq;
                        menorDeMayores.HijoIzq.Padre    = menorDeMayores.Padre;
                    }
                    else
                    {
                        menorDeMayores.Padre.HijoIzq = menorDeMayores.HijoIzq;
                        menorDeMayores.HijoIzq.Padre = menorDeMayores.Padre;
                    }
                    menorDeMayores.Padre   = null;
                    menorDeMayores.HijoIzq = null;
                    return(toRet);
                }
            }
        }
Пример #21
0
        private NodoAvl insertarAvl(NodoAvl raiz, Comparador dt, Logical h)
        {
            NodoAvl n1;

            if (raiz == null)
            {
                raiz = new NodoAvl(dt);
                h.enviarLogica(true);
            }

            else if (dt.firstIdMenor(raiz.valorNodo(), 0))
            {
                NodoAvl iz;
                iz = insertarAvl((NodoAvl)raiz.subarbolIzq(), dt, h);
                raiz.ramaIzq(iz);
                //De verificar la rama izquierda en donde se insertara el nodo
                if (h.valorLogico())//obtiene un dato para verificar si hay datos
                {
                    switch (raiz.fe)
                    {
                    case 1:
                        raiz.fe = 0;
                        h.enviarLogica(false);
                        break;

                    case 0:
                        raiz.fe = -1;
                        break;

                    case -1:     // aplicar rotación a la izquierda
                        n1 = (NodoAvl)raiz.subarbolIzq();
                        if (n1.fe == -1)
                        {
                            raiz = rotacionII(raiz, n1);
                        }
                        else
                        {
                            raiz = rotacionID(raiz, n1);
                        }
                        h.enviarLogica(false);
                        break;
                    }
                }
            }
            else if (dt.firstIdMayor(raiz.valorNodo(), 0))
            {
                NodoAvl dr;
                dr = insertarAvl((NodoAvl)raiz.subarbolDch(), dt, h);
                raiz.ramaDch(dr);

                if (h.valorLogico())
                {
                    switch (raiz.fe)
                    {
                    case 1:     // aplicar rotación a la derecha
                        n1 = (NodoAvl)raiz.subarbolDch();
                        if (n1.fe == +1)
                        {
                            raiz = rotacionDD(raiz, n1);
                        }
                        else
                        {
                            raiz = rotacionDI(raiz, n1);
                        }
                        h.enviarLogica(false);
                        break;

                    case 0:
                        raiz.fe = +1;
                        break;

                    case -1:
                        raiz.fe = 0;
                        h.enviarLogica(false);
                        break;
                    }
                }
            }
            else
            {
                throw new Exception("No puede haber claves repetidas ");
            }

            return(raiz);
        }
Пример #22
0
 public void Clear()
 {
     raiz  = null;
     count = 0;
 }