示例#1
0
        private void Balancear(Nodo <T> node, bool isnew, bool isleft)
        {
            var timer = new LogFile();
            var exit  = false;

            while ((node != null) && !exit)
            {
                var didRotate = false;

                if (isnew)
                {
                    if (isleft)
                    {
                        node.Factor--;
                    }
                    else
                    {
                        node.Factor++;
                    }
                }
                else
                {
                    if (node.Factor == 0)
                    {
                        exit = true;
                    }
                    timer.Logcreate("Balanceo");

                    if (isleft)
                    {
                        node.Factor++;
                    }

                    else
                    {
                        node.Factor--;
                    }
                }
                if (node.Factor == 0)
                {
                    exit = true;
                    timer.Logcreate("Balanceo");
                }

                else if (node.Factor == -2)
                {
                    if (node.Izquierdo.Factor == 1)
                    {
                        RotacionDDerecha(node);
                        didRotate = true;
                    }
                    else
                    {
                        RotaciónDerecha(node);
                        didRotate = true;
                    }
                    exit = true;
                    timer.Logcreate("Balanceo");
                }
                else if (node.Factor == 2)
                {
                    if (node.Derecho.Factor == -1)
                    {
                        RotacionDIzquierda(node);
                        didRotate = true;
                    }
                    else
                    {
                        RotaciónIzquierda(node);
                        didRotate = true;
                    }
                    exit = true;
                    timer.Logcreate("Balanceo");
                }
                if ((didRotate) && (node.Padre != null) && (!isnew))
                {
                    node = node.Padre;
                }

                if (node.Padre != null)
                {
                    if (node.Padre.Derecho == node)
                    {
                        isleft = false;
                    }
                    else
                    {
                        isleft = true;
                    }
                    if ((!isnew) && (node.Factor == 0))
                    {
                        exit = false;
                    }
                }
                node = node.Padre;
            }
        }
示例#2
0
        public Nodo <T> Eliminar(T value)
        {
            var timer    = new LogFile();
            var auxiliar = root;
            var padre    = null as Nodo <T>;
            var esHijoIz = true;

            while (Comparador(auxiliar.value, value) != 0)
            {
                padre = auxiliar;
                if (Comparador(value, auxiliar.value) < 0)
                {
                    esHijoIz = true;
                    auxiliar = auxiliar.Izquierdo;
                }
                else
                {
                    esHijoIz = false;
                    auxiliar = auxiliar.Derecho;
                }
                if (auxiliar == null)
                {
                    return(null);
                }
            }// Fin ciclo inicial

            if (auxiliar.Izquierdo == null && auxiliar.Derecho == null) // nodo hoja
            {
                if (padre != null)
                {
                    if (esHijoIz)
                    {
                        padre.Izquierdo = null;
                        timer.Logcreate("Eliminación");
                    }
                    else
                    {
                        padre.Derecho = null;
                        timer.Logcreate("Eliminación");
                    }
                    Balancear(padre, false, esHijoIz);
                }
                else
                {
                    root = null;
                    timer.Logcreate("Eliminación");
                }
            }
            else if (auxiliar.Derecho == null) // solo hijo Izquierdo
            {
                if (padre != null)
                {
                    if (esHijoIz)
                    {
                        padre.Izquierdo          = auxiliar.Izquierdo;
                        auxiliar.Izquierdo.Padre = padre;
                        timer.Logcreate("Eliminación");
                    }
                    else
                    {
                        padre.Derecho            = auxiliar.Izquierdo;
                        auxiliar.Izquierdo.Padre = padre;
                        timer.Logcreate("Eliminación");
                    }
                    Balancear(padre, false, esHijoIz);
                }
                else
                {
                    auxiliar.Izquierdo.Padre = null;
                    root = auxiliar.Izquierdo;
                    timer.Logcreate("Eliminación");
                }
            }
            else if (auxiliar.Izquierdo == null) //solo hijo Derecho
            {
                if (padre != null)
                {
                    if (esHijoIz)
                    {
                        padre.Izquierdo        = auxiliar.Derecho;
                        auxiliar.Derecho.Padre = padre;
                        timer.Logcreate("Eliminación");
                    }
                    else
                    {
                        padre.Derecho          = auxiliar.Derecho;
                        auxiliar.Derecho.Padre = padre;
                        timer.Logcreate("Eliminación");
                    }
                    Balancear(padre, false, esHijoIz);
                }
                else
                {
                    auxiliar.Derecho.Padre = null;
                    root = auxiliar.Derecho;
                    timer.Logcreate("Eliminación");
                }
            }

            else // Tiene dos hijos
            {
                var reemplazo = Reemplazar(auxiliar);
                if (root == auxiliar)
                {
                    root       = reemplazo;
                    root.Padre = null;
                    timer.Logcreate("Eliminación");
                    Balancear(root, false, esHijoIz);
                }
                else if (esHijoIz)
                {
                    padre.Izquierdo       = reemplazo;
                    padre.Izquierdo.Padre = padre;
                    timer.Logcreate("Eliminación");
                    Balancear(padre, false, esHijoIz);
                }
                else
                {
                    padre.Derecho = reemplazo;
                    timer.Logcreate("Eliminación");
                    Balancear(padre, false, esHijoIz);
                }
                reemplazo.Izquierdo = auxiliar.Izquierdo;
                timer.Logcreate("Eliminación");
            }
            return(auxiliar);
        }
示例#3
0
        protected void RotacionDIzquierda(Nodo <T> nodo)
        {
            var timer   = new LogFile();
            var RParent = nodo.Padre;
            var P       = nodo;
            var Q       = nodo.Derecho;
            var R       = Q.Izquierdo;
            var B       = R.Izquierdo;
            var C       = R.Derecho;

            if (RParent != null)
            {
                if (RParent.Derecho == P)
                {
                    RParent.Derecho = R;
                }
                else
                {
                    RParent.Izquierdo = R;
                }
            }
            P.Derecho   = B;
            Q.Izquierdo = C;
            R.Izquierdo = P;
            R.Derecho   = Q;

            R.Padre = RParent;
            P.Padre = Q.Padre = R;

            if (B != null)
            {
                B.Padre = P;
            }
            if (C != null)
            {
                C.Padre = Q;
            }
            switch (R.Factor)
            {
            case -1:
            {
                P.Factor = 0;
                Q.Factor = 1;
            }
            break;

            case 0:
            {
                P.Factor = 0;
                Q.Factor = 0;
            }
            break;

            case 1:
            {
                P.Factor = -1;
                Q.Factor = 0;
            }
            break;
            }

            timer.Logcreate("Rotación Doble a la Izquierda");
        }
示例#4
0
        protected void RotacionDDerecha(Nodo <T> nodo)
        {
            var timer      = new LogFile();
            var RootParent = nodo.Padre;
            var P          = nodo as Nodo <T>;
            var Q          = P.Izquierdo;
            var R          = Q.Derecho;
            var B          = R.Izquierdo;
            var C          = R.Derecho;

            if (RootParent != null)
            {
                if (RootParent.Derecho == P)
                {
                    RootParent.Derecho = R;
                }
                else
                {
                    RootParent.Izquierdo = R;
                }
            }
            else
            {
                root       = R;
                root.Padre = null;
            }

            Q.Derecho   = B;
            P.Izquierdo = C;
            R.Izquierdo = Q;
            R.Derecho   = P;

            R.Padre = RootParent;
            P.Padre = Q.Padre = R;

            if (B != null)
            {
                B.Padre = Q;
            }
            if (C != null)

            {
                C.Padre = P;
            }

            switch (R.Factor)
            {
            case -1:
            {
                Q.Factor = 0;
                P.Factor = 1;
            }
            break;

            case 0:
            {
                Q.Factor = 0;
                P.Factor = 0;
            } break;

            case 1:
            {
                Q.Factor = -1;
                P.Factor = 0;
            } break;
            }
            R.Factor = 0;
            timer.Logcreate("Rotación Doble a la derecha");
        }
示例#5
0
        public AVL(CompareTo <T> compare)
        {
            root = null;

            this.Comparador = compare;
        }
示例#6
0
 public AVL()
 {
     root = null;
 }