Exemple #1
0
        //Instertar
        public AVL <T> Insertar(T value, AVL <T> root)
        {
            AVL <T> Temp = new AVL <T>();

            Temp.Valor    = value;
            Temp.Derecho  = null;
            Temp.Izquiero = null;

            if (root == null)
            {
                root = Temp;
            }

            else if (value.CompareTo(root.Valor) < -1)
            {
                root.Izquiero = Insertar(value, root.Izquiero);
                //me voy a la izquierda
            }
            else if (value.CompareTo(root.Valor) > 1)
            {
                root.Derecho = Insertar(value, root.Derecho);
                //me voy a la derecha
            }

            if (Alturas(root.Izquiero) - Alturas(Raiz.Derecho) == 2)
            {
                if (value.CompareTo(root.Izquiero.Valor) < -1)   //value < root.izquiero.valor
                {
                    root = RotacionIzquierdaSimple(root);
                }
                else
                {
                    root = RotacionIzquierdaDoble(root);
                }
            }

            if (Alturas(root.Derecho) - Alturas(Raiz.Izquiero) == 2)
            {
                if (value.CompareTo(root.Derecho.Valor) > 1) //value < root.izquiero.valor
                {
                    root = RotacionDerechaSimple(root);
                }
                else
                {
                    root = RotacionDerechaDoble(root);
                }
            }

            root.altura = Max(Alturas(root.Izquiero), Alturas(root.Derecho)) + 1;
            return(root);
        }
Exemple #2
0
        public AVL <T> Eliminar(T VaElimina, AVL <T> root)
        {
            if (root != null)
            {
                if (VaElimina.CompareTo(root.Valor) < -1) //value < root.valor
                {
                    nDelete = root;
                    Eliminar(VaElimina, root.Izquiero);
                }

                else
                {
                    if (VaElimina.CompareTo(root.Valor) > 1)
                    {
                        nDelete = root;
                        Eliminar(VaElimina, root.Derecho);
                    }
                    else
                    {
                        //Eliminamos

                        AVL <T> NodoDelete = Raiz;
                        if (NodoDelete.Derecho == null)
                        {
                            Raiz = NodoDelete.Izquiero;

                            if (Alturas(nDelete.Izquiero) - Alturas(nDelete.Derecho) == 2)
                            {
                                if (VaElimina.CompareTo(nDelete.Valor) < -1)
                                {
                                    nP = RotacionIzquierdaSimple(nDelete);
                                }
                                else
                                {
                                    nP = RotacionDerechaSimple(nDelete);
                                }
                            }
                            if (Alturas(nDelete.Derecho) - Alturas(nDelete.Izquiero) == 2)
                            {
                                if (VaElimina.CompareTo(nDelete.Derecho.Valor) > 1)
                                {
                                    nDelete = RotacionDerechaSimple(nDelete);
                                }
                                else
                                {
                                    nDelete = RotacionDerechaDoble(nDelete);
                                    nP      = RotacionDerechaSimple(nDelete);
                                }
                            }
                        }

                        else
                        {
                            if (NodoDelete.Izquiero == null)
                            {
                                root = NodoDelete.Derecho;
                            }
                            else
                            {
                                if (Alturas(root.Izquiero) - Alturas(root.Derecho) > 0)
                                {
                                    AVL <T> Naux    = null;
                                    AVL <T> AUX     = root.Izquiero;
                                    bool    bandera = false;
                                    while (AUX.Derecho != null)
                                    {
                                        Naux    = AUX;
                                        AUX     = AUX.Derecho;
                                        bandera = true;
                                    }
                                    root.Valor = AUX.Valor;
                                    NodoDelete = AUX;
                                    if (bandera == true)
                                    {
                                        Naux.Derecho = AUX.Izquiero;
                                    }
                                    else
                                    {
                                        root.Izquiero = AUX.Izquiero;
                                    }
                                }
                                else
                                {
                                    if (Alturas(root.Derecho) - Alturas(root.Izquiero) > 0)
                                    {
                                        AVL <T> Naux    = null;
                                        AVL <T> AUX     = root.Derecho;
                                        bool    bandera = false;
                                        while (AUX.Izquiero != null)
                                        {
                                            Naux    = AUX;
                                            AUX     = AUX.Izquiero;
                                            bandera = true;
                                        }
                                        root.Valor = AUX.Valor;
                                        NodoDelete = AUX;
                                        if (bandera == true)
                                        {
                                            Naux.Izquiero = AUX.Derecho;
                                        }
                                        else
                                        {
                                            root.Derecho = AUX.Derecho;
                                        }
                                    }
                                    else
                                    {
                                        if (Alturas(root.Derecho) - Alturas(root.Izquiero) == 0)
                                        {
                                            AVL <T> Naux    = null;
                                            AVL <T> AUX     = root.Izquiero;
                                            bool    bandera = false;
                                            while (AUX.Derecho != null)
                                            {
                                                Naux    = AUX;
                                                AUX     = AUX.Derecho;
                                                bandera = true;
                                            }
                                            root.Valor = AUX.Valor;
                                            NodoDelete = AUX;
                                            if (bandera == true)
                                            {
                                                Naux.Derecho = AUX.Izquiero;
                                            }
                                            else
                                            {
                                                root.Izquiero = AUX.Izquiero;
                                            }
                                        }
                                    }
                                }
                            }
                        }

                        //fin eliminamos
                    }
                }
            }
            return(nP);
        }
Exemple #3
0
 private static AVL <T> RotacionDerechaDoble(AVL <T> NH)
 {
     NH.Derecho = RotacionIzquierdaSimple(NH.Derecho);
     return(RotacionDerechaSimple(NH));
 }
Exemple #4
0
 private static AVL <T> RotacionIzquierdaDoble(AVL <T> H)
 {
     H.Izquiero = RotacionDerechaSimple(H.Izquiero);
     return(RotacionIzquierdaSimple(H));
 }
Exemple #5
0
 private static int Alturas(AVL <T> R)
 {
     return(R == null ? -1 : R.altura);
 }