예제 #1
0
        private void RotacionSimple(NodoAVL nodo, NodoAVL padre, string tipo)
        {
            if (tipo == "derecha")
            {
                NodoAVL hijoizq    = nodo.GetHijoIzquierdo();
                NodoAVL hijoizqder = hijoizq.GetHijoDerecho();
                if (padre != null)
                {
                    if (padre.GetHijoDerecho() == nodo)
                    {
                        padre.SetHijoDerecho(hijoizq);
                    }
                    else
                    {
                        padre.SetHijoIzquierdo(hijoizq);
                    }
                }
                else
                {
                    this.raiz = hijoizq;
                }
                nodo.SetHijoIzquierdo(hijoizqder);
                hijoizq.SetHijoDerecho(nodo);
                nodo.SetPadre(hijoizq);
                if (hijoizqder != null)
                {
                    hijoizqder.SetPadre(nodo);
                }
                hijoizq.SetPadre(padre);
                nodo.SetFe(0);
                hijoizq.SetFe(0);
            }
            else
            {
                NodoAVL hijoder    = nodo.GetHijoDerecho();
                NodoAVL hijoderizq = hijoder.GetHijoIzquierdo();
                if (padre != null)
                {
                    if (padre.GetHijoDerecho() == nodo)
                    {
                        padre.SetHijoDerecho(hijoder);
                    }
                    else
                    {
                        padre.SetHijoIzquierdo(hijoder);
                    }
                }
                else
                {
                    this.raiz = hijoder;
                }

                nodo.SetHijoDerecho(hijoderizq);
                hijoder.SetHijoIzquierdo(nodo);
                nodo.SetPadre(hijoder);
                if (hijoderizq != null)
                {
                    hijoderizq.SetPadre(nodo);
                }
                hijoder.SetPadre(padre);
                hijoder.SetFe(0);
                nodo.SetFe(0);
            }
        }
예제 #2
0
        private void EquilibrarArbol(NodoAVL nodo, string lado, bool nuevo)
        {
            bool salir = false;

            while (nodo != null && !salir)
            {
                if (nuevo)
                {
                    if (lado == "izquierda")
                    {
                        int auxfe = nodo.GetFe();
                        auxfe -= 1;
                        nodo.SetFe(auxfe);
                    }
                    else
                    {
                        int auxfe = nodo.GetFe();
                        auxfe += 1;
                        nodo.SetFe(auxfe);
                    }
                }
                else
                {
                    if (lado == "izquierda")
                    {
                        int auxfe = nodo.GetFe();
                        auxfe += 1;
                        nodo.SetFe(auxfe);
                    }
                    else
                    {
                        int auxfe = nodo.GetFe();
                        auxfe -= 1;
                        nodo.SetFe(auxfe);
                    }
                }
                if (nodo.GetFe() == 0)
                {
                    salir = true;
                }
                else if (nodo.GetFe() == -2)
                {
                    if (nodo.GetHijoIzquierdo().GetFe() == 1)
                    {
                        RotacionDoble(nodo, nodo.GetPadre(), "derecha");
                    }
                    else
                    {
                        RotacionSimple(nodo, nodo.GetPadre(), "derecha");
                    }
                    salir = true;
                }
                else if (nodo.GetFe() == 2)
                {
                    if (nodo.GetHijoDerecho().GetFe() == -1)
                    {
                        RotacionDoble(nodo, nodo.GetPadre(), "izquierda");
                    }
                    else
                    {
                        RotacionSimple(nodo, nodo.GetPadre(), "izquierda");
                    }
                    salir = true;
                }
                if (nodo.GetPadre() != null)
                {
                    if (nodo.GetPadre().GetHijoDerecho() == nodo)
                    {
                        lado = "derecha";
                    }
                    else
                    {
                        lado = "izquierda";
                    }
                }
                nodo = nodo.GetPadre();
            }
        }