Beispiel #1
0
 // Constructor.
 public A_AVL(int valorNuevo, A_AVL izquierdo, A_AVL derecho, A_AVL padre)
 {
     valor         = valorNuevo;
     NodoIzquierdo = izquierdo;
     NodoDerecho   = derecho;
     NodoPadre     = padre;
     altura        = 0;
 }
Beispiel #2
0
        //Rotacion Derecha Simple
        private static A_AVL RotacionDerechaSimple(A_AVL k1)
        {
            A_AVL k2 = k1.NodoDerecho;

            k1.NodoDerecho   = k2.NodoIzquierdo;
            k2.NodoIzquierdo = k1;
            k1.altura        = max(Alturas(k1.NodoIzquierdo), Alturas(k1.NodoDerecho)) + 1;
            k2.altura        = max(Alturas(k2.NodoDerecho), k1.altura) + 1;
            return(k2);
        }
Beispiel #3
0
 //Eliminar un valor del arbol
 public void Eliminar(int dato)
 {
     if (Raiz == null)
     {
         Raiz = new A_AVL(dato, null, null, null);
     }
     else
     {
         Raiz.Eliminar(dato, ref Raiz);
     }
 }
Beispiel #4
0
 // Agrega un nuevo valor al arbol.
 public void Insertar(int dato)
 {
     if (Raiz == null)
     {
         Raiz = new A_AVL(dato, null, null, null);
     }
     else
     {
         Raiz = Raiz.Insertar(dato, Raiz);
     }
 }
Beispiel #5
0
 //Funcion para obtener la altura del arbol
 public int getAltura(A_AVL nodoActual)
 {
     if (nodoActual == null)
     {
         return(0);
     }
     else
     {
         return(1 + Math.Max(getAltura(nodoActual.NodoIzquierdo), getAltura(nodoActual.NodoDerecho)));
     }
 }
Beispiel #6
0
 //Funcion para insertar un nuevo valor en el arbol AVL
 public A_AVL Insertar(int valorNuevo, A_AVL Raiz)
 {
     if (Raiz == null)
     {
         Raiz = new A_AVL(valorNuevo, null, null, null);
     }
     else if (valorNuevo < Raiz.valor)
     {
         Raiz.NodoIzquierdo = Insertar(valorNuevo, Raiz.NodoIzquierdo);
     }
     else if (valorNuevo > Raiz.valor)
     {
         Raiz.NodoDerecho = Insertar(valorNuevo, Raiz.NodoDerecho);
     }
     else
     {
         MessageBox.Show("Valor Existente en el Arbol", "Error", MessageBoxButtons.OK);
     }
     //Realiza las rotaciones simples o dobles segun el caso
     if (Alturas(Raiz.NodoIzquierdo) - Alturas(Raiz.NodoDerecho) == 2)
     {
         if (valorNuevo < Raiz.NodoIzquierdo.valor)
         {
             Raiz = RotacionIzquierdaSimple(Raiz);
         }
         else
         {
             Raiz = RotacionIzquierdaDoble(Raiz);
         }
     }
     if (Alturas(Raiz.NodoDerecho) - Alturas(Raiz.NodoIzquierdo) == 2)
     {
         if (valorNuevo > Raiz.NodoDerecho.valor)
         {
             Raiz = RotacionDerechaSimple(Raiz);
         }
         else
         {
             Raiz = RotacionDerechaDoble(Raiz);
         }
     }
     Raiz.altura = max(Alturas(Raiz.NodoIzquierdo), Alturas(Raiz.NodoDerecho)) + 1;
     return(Raiz);
 }
Beispiel #7
0
 //Buscar un valor en el arbol
 public void buscar(int valorBuscar, A_AVL Raiz)
 {
     if (Raiz != null)
     {
         if (valorBuscar < Raiz.valor)
         {
             buscar(valorBuscar, Raiz.NodoIzquierdo);
         }
         else
         {
             if (valorBuscar > Raiz.valor)
             {
                 buscar(valorBuscar, Raiz.NodoDerecho);
             }
         }
     }
     else
     {
         MessageBox.Show("Valor no encontrado", "Error", MessageBoxButtons.OK);
     }
 }
Beispiel #8
0
        public void colorearB(Graphics grafo, Font fuente, Brush Relleno, Brush RellenoFuente, Pen Lapiz, A_AVL Raiz,
                              int busqueda)
        {
            Brush entorno = Brushes.Red;

            if (Raiz != null)
            {
                Raiz.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz);
                if (busqueda < Raiz.valor)
                {
                    Thread.Sleep(500);
                    Raiz.colorear(grafo, fuente, entorno, Brushes.Blue, Lapiz);
                    colorearB(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.NodoIzquierdo, busqueda);
                }
                else
                {
                    if (busqueda > Raiz.valor)
                    {
                        Thread.Sleep(500);
                        Raiz.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz);
                        colorearB(grafo, fuente, Relleno, RellenoFuente, Lapiz, Raiz.NodoDerecho, busqueda);
                    }
                    else
                    {
                        Raiz.colorear(grafo, fuente, entorno, RellenoFuente, Lapiz);
                        Thread.Sleep(500);
                    }
                }
            }
        }
Beispiel #9
0
 public A_DibujarAVL(A_AVL RaizNueva)
 {
     Raiz = RaizNueva;
 }
Beispiel #10
0
 // Constructor.
 public A_DibujarAVL()
 {
     aux = new A_AVL();
 }
Beispiel #11
0
        public A_AVL Eliminar(int valorEliminar, ref A_AVL Raiz)
        {
            if (Raiz != null)
            {
                if (valorEliminar < Raiz.valor)
                {
                    nodoE = Raiz;
                    Eliminar(valorEliminar, ref Raiz.NodoIzquierdo);
                }
                else
                {
                    if (valorEliminar > Raiz.valor)
                    {
                        nodoE = Raiz;
                        Eliminar(valorEliminar, ref Raiz.NodoDerecho);
                    }
                    else
                    {
                        //Posicionado sobre el elemento a eliminar
                        A_AVL NodoEliminar = Raiz;
                        if (NodoEliminar.NodoDerecho == null)
                        {
                            Raiz = NodoEliminar.NodoIzquierdo;

                            if (Alturas(nodoE.NodoIzquierdo) - Alturas(nodoE.NodoDerecho) == 2)
                            {
                                //MessageBox.Show("nodoE" + nodoE.valor.ToString());
                                if (valorEliminar < nodoE.valor)
                                {
                                    nodoP = RotacionIzquierdaSimple(nodoE);
                                }
                                else
                                {
                                    nodoE = RotacionDerechaSimple(nodoE);
                                }
                            }

                            if (Alturas(nodoE.NodoDerecho) - Alturas(nodoE.NodoIzquierdo) == 2)
                            {
                                if (valorEliminar > nodoE.NodoDerecho.valor)
                                {
                                    nodoE = RotacionDerechaSimple(nodoE);
                                }
                                else
                                {
                                    nodoE = RotacionDerechaDoble(nodoE);
                                    nodoP = RotacionDerechaSimple(nodoE);
                                }
                            }
                        }
                        else
                        {
                            if (NodoEliminar.NodoIzquierdo == null)
                            {
                                Raiz = NodoEliminar.NodoDerecho;
                            }
                            else
                            {
                                if (Alturas(Raiz.NodoIzquierdo) - Alturas(Raiz.NodoDerecho) > 0)
                                {
                                    A_AVL AuxiliarNodo = null;
                                    A_AVL Auxiliar     = Raiz.NodoIzquierdo;
                                    bool  Bandera      = false;
                                    while (Auxiliar.NodoDerecho != null)
                                    {
                                        AuxiliarNodo = Auxiliar;
                                        Auxiliar     = Auxiliar.NodoDerecho;
                                        Bandera      = true;
                                    }
                                    Raiz.valor   = Auxiliar.valor;
                                    NodoEliminar = Auxiliar;
                                    if (Bandera == true)
                                    {
                                        AuxiliarNodo.NodoDerecho = Auxiliar.NodoIzquierdo;
                                    }
                                    else
                                    {
                                        Raiz.NodoIzquierdo = Auxiliar.NodoIzquierdo;
                                    }
                                    //Realiza las rotaciones simples o dobles segun el caso
                                }
                                else
                                {
                                    if (Alturas(Raiz.NodoDerecho) - Alturas(Raiz.NodoIzquierdo) > 0)
                                    {
                                        A_AVL AuxiliarNodo = null;
                                        A_AVL Auxiliar     = Raiz.NodoDerecho;
                                        bool  Bandera      = false;
                                        while (Auxiliar.NodoIzquierdo != null)
                                        {
                                            AuxiliarNodo = Auxiliar;
                                            Auxiliar     = Auxiliar.NodoIzquierdo;
                                            Bandera      = true;
                                        }
                                        Raiz.valor   = Auxiliar.valor;
                                        NodoEliminar = Auxiliar;
                                        if (Bandera == true)
                                        {
                                            AuxiliarNodo.NodoIzquierdo = Auxiliar.NodoDerecho;
                                        }
                                        else
                                        {
                                            Raiz.NodoDerecho = Auxiliar.NodoDerecho;
                                        }
                                    }
                                    else
                                    {
                                        if (Alturas(Raiz.NodoDerecho) - Alturas(Raiz.NodoIzquierdo) == 0)
                                        {
                                            A_AVL AuxiliarNodo = null;
                                            A_AVL Auxiliar     = Raiz.NodoIzquierdo;
                                            bool  Bandera      = false;
                                            while (Auxiliar.NodoDerecho != null)
                                            {
                                                AuxiliarNodo = Auxiliar;
                                                Auxiliar     = Auxiliar.NodoDerecho;
                                                Bandera      = true;
                                            }
                                            Raiz.valor   = Auxiliar.valor;
                                            NodoEliminar = Auxiliar;
                                            if (Bandera == true)
                                            {
                                                AuxiliarNodo.NodoDerecho = Auxiliar.NodoIzquierdo;
                                            }
                                            else
                                            {
                                                Raiz.NodoIzquierdo = Auxiliar.NodoIzquierdo;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                MessageBox.Show("Nodo inexistente en el arbol", "Error", MessageBoxButtons.OK);
            }
            return(nodoP);
        }
Beispiel #12
0
 private static int Alturas(A_AVL Raiz)
 {
     return(Raiz == null ? -1 : Raiz.altura);
 }
Beispiel #13
0
 //Doble Rotacion Derecha
 private static A_AVL RotacionDerechaDoble(A_AVL k1)
 {
     k1.NodoDerecho = RotacionIzquierdaSimple(k1.NodoDerecho);
     return(RotacionDerechaSimple(k1));
 }
Beispiel #14
0
 //Doble Rotacion Izquierda
 private static A_AVL RotacionIzquierdaDoble(A_AVL k3)
 {
     k3.NodoIzquierdo = RotacionDerechaSimple(k3.NodoIzquierdo);
     return(RotacionIzquierdaSimple(k3));
 }