Example #1
0
        //private BNode<TLlave, T> DeletePredecessor(BNode<TLlave, T> node)
        //{
        //    //γθμπλεταρ
        //    if (EsHoja(node.Hijos))
        //    {
        //        string ItemToRemove = node.Datos[node.Datos.Count() - 1];
        //        node.Datos = node.Datos.Where(val => val != ItemToRemove).ToArray();
        //        node.Llaves = node.Llaves.Where(val => val != ItemToRemove).ToArray();

        //    }
        //}

        private void EliminarLlavedeSubarbol(BNode <TLlave, T> parentNode, TLlave keyToDelete, int subtreeIndexInNode)
        {
            BNode <TLlave, T> childNode = fabricar.TraerNodo(int.Parse(parentNode.Hijos[subtreeIndexInNode]));

            if ((childNode.Datos.Count() > 0))
            {
                int leftIndex  = subtreeIndexInNode - 1;
                int rightIndex = subtreeIndexInNode + 1;

                BNode <TLlave, T> leftSibling = subtreeIndexInNode > 0 ?
                                                fabricar.TraerNodo(int.Parse(parentNode.Hijos[leftIndex])) : null;
                BNode <TLlave, T> rightSibling = subtreeIndexInNode < parentNode.Hijos.Count() - 1 ?
                                                 fabricar.TraerNodo(int.Parse(parentNode.Hijos[rightIndex])) : null;

                if (leftSibling != null && leftSibling.Datos.Count() > fabricar.ObtenerGrado() - 1)
                {
                    //βετα
                    List <string> lst = childNode.Datos.OfType <string>().ToList();
                    lst.Insert(0, parentNode.Datos[subtreeIndexInNode]);
                    childNode.Datos = lst;

                    lst = childNode.Llaves.OfType <string>().ToList();
                    lst.Insert(0, parentNode.Llaves[subtreeIndexInNode]);
                    childNode.Llaves = lst;

                    parentNode.Datos[subtreeIndexInNode] = leftSibling.Datos.Last();

                    string KeyToRemove  = leftSibling.Llaves[leftSibling.Datos.Count() - 1];
                    string ItemToRemove = leftSibling.Datos[leftSibling.Datos.Count() - 1];
                    leftSibling.Datos  = leftSibling.Datos.Where(val => val != ItemToRemove).ToArray().ToList();
                    leftSibling.Llaves = leftSibling.Llaves.Where(val => val != KeyToRemove).ToArray().ToList();

                    if (!EsHoja(leftSibling.Hijos))
                    {
                        //βετα
                        lst = childNode.Hijos.OfType <string>().ToList();
                        lst.Insert(0, leftSibling.Hijos.Last());
                        childNode.Hijos = lst;

                        KeyToRemove       = leftSibling.Hijos[leftSibling.Hijos.Count() - 1];
                        leftSibling.Hijos = leftSibling.Hijos.Where(val => val != KeyToRemove).ToArray().ToList();
                    }
                    fabricar.GuardarNodo(leftSibling.Informacion());
                    fabricar.GuardarNodo(parentNode.Informacion());
                    fabricar.GuardarNodo(childNode.Informacion());
                }
                else if (rightSibling != null && rightSibling.Datos.Count() > fabricar.ObtenerGrado() - 1)
                {
                    //βετα
                    childNode.Hijos[childNode.Hijos.Count() - 1] = (parentNode.Hijos[subtreeIndexInNode]);
                    parentNode.Datos[subtreeIndexInNode]         = rightSibling.Datos.First();
                    parentNode.Llaves[subtreeIndexInNode]        = rightSibling.Llaves.First();

                    string ItemToRemove = rightSibling.Datos[0];
                    rightSibling.Datos = rightSibling.Datos.Where(val => val != ItemToRemove).ToArray().ToList();

                    ItemToRemove        = rightSibling.Llaves[0];
                    rightSibling.Llaves = rightSibling.Llaves.Where(val => val != ItemToRemove).ToArray().ToList();

                    if (!EsHoja(rightSibling.Hijos))
                    {
                        List <string> lst = childNode.Hijos.OfType <string>().ToList();
                        lst.Insert(0, rightSibling.Hijos.Last());
                        childNode.Hijos = lst;

                        ItemToRemove       = rightSibling.Hijos[0];
                        rightSibling.Hijos = rightSibling.Hijos.Where(val => val != ItemToRemove).ToArray().ToList();
                    }
                    fabricar.GuardarNodo(rightSibling.Informacion());
                    fabricar.GuardarNodo(parentNode.Informacion());
                    fabricar.GuardarNodo(childNode.Informacion());
                }
                else
                {
                    //βετα
                    if (leftSibling != null)
                    {
                        List <string> lst = childNode.Datos.OfType <string>().ToList();
                        lst.Insert(0, parentNode.Datos[subtreeIndexInNode]);
                        childNode.Datos = lst;

                        lst = childNode.Llaves.OfType <string>().ToList();
                        lst.Insert(0, parentNode.Llaves[subtreeIndexInNode]);
                        childNode.Llaves = lst;

                        var oldEntries    = childNode.Datos;
                        var oldEntriesKey = childNode.Llaves;
                        childNode.Datos  = leftSibling.Datos;
                        childNode.Llaves = leftSibling.Llaves;

                        var a = new string[oldEntries.Count + childNode.Datos.Count];
                        childNode.Datos.CopyTo(a, 0);
                        oldEntries.CopyTo(a, childNode.Datos.Count);

                        a = new string[oldEntriesKey.Count + childNode.Llaves.Count];
                        childNode.Llaves.CopyTo(a, 0);
                        oldEntriesKey.CopyTo(a, childNode.Llaves.Count);

                        if (!EsHoja(leftSibling.Hijos))
                        {
                            //βετα
                            var oldChildren = childNode.Hijos;
                            childNode.Hijos = leftSibling.Hijos;

                            a = new string[oldEntries.Count + childNode.Datos.Count];
                            childNode.Datos.CopyTo(a, 0);
                            oldEntries.CopyTo(a, childNode.Datos.Count);

                            a = new string[oldEntriesKey.Count + childNode.Llaves.Count];
                            childNode.Llaves.CopyTo(a, 0);
                            oldEntriesKey.CopyTo(a, childNode.Llaves.Count);
                        }

                        string ItemToRemove = parentNode.Hijos[leftIndex];
                        parentNode.Hijos = parentNode.Hijos.Where(val => val != ItemToRemove).ToArray().ToList();

                        ItemToRemove     = parentNode.Datos[subtreeIndexInNode];
                        parentNode.Datos = parentNode.Datos.Where(val => val != ItemToRemove).ToArray().ToList();

                        ItemToRemove      = parentNode.Llaves[subtreeIndexInNode];
                        parentNode.Llaves = parentNode.Llaves.Where(val => val != ItemToRemove).ToArray().ToList();
                        fabricar.GuardarNodo(parentNode.Informacion());
                        fabricar.GuardarNodo(childNode.Informacion());
                    }
                    else if (rightSibling != null)
                    {
                        //βετα
                        childNode.Datos[childNode.Datos.Count() - 1]   = (parentNode.Datos[subtreeIndexInNode]);
                        childNode.Llaves[childNode.Llaves.Count() - 1] = (parentNode.Llaves[subtreeIndexInNode]);
                        if (rightSibling != null)
                        {
                            var a = new string[rightSibling.Datos.Count + childNode.Datos.Count];
                            childNode.Datos.CopyTo(a, 0);
                            rightSibling.Datos.CopyTo(a, childNode.Datos.Count);

                            a = new string[rightSibling.Llaves.Count + childNode.Llaves.Count];
                            childNode.Llaves.CopyTo(a, 0);
                            rightSibling.Llaves.CopyTo(a, childNode.Llaves.Count);

                            if (!EsHoja(rightSibling.Hijos))
                            {
                                a = new string[rightSibling.Hijos.Count + childNode.Hijos.Count];
                                childNode.Hijos.CopyTo(a, 0);
                                rightSibling.Hijos.CopyTo(a, childNode.Hijos.Count);
                            }

                            string ItemToRemove = parentNode.Hijos[rightIndex];
                            parentNode.Hijos = parentNode.Hijos.Where(val => val != ItemToRemove).ToArray().ToList();

                            ItemToRemove     = parentNode.Datos[subtreeIndexInNode];
                            parentNode.Datos = parentNode.Datos.Where(val => val != ItemToRemove).ToArray().ToList();

                            ItemToRemove      = parentNode.Llaves[subtreeIndexInNode];
                            parentNode.Llaves = parentNode.Llaves.Where(val => val != ItemToRemove).ToArray().ToList();

                            fabricar.GuardarNodo(parentNode.Informacion());
                            fabricar.GuardarNodo(childNode.Informacion());
                        }
                    }
                }
            }
            EliminarInterno(childNode, keyToDelete);
        }
Example #2
0
 public BTree(string FileName)
 {
     fabricar = new Fabrica <TLlave, T>(FileName);
     root     = fabricar.TraerNodo(fabricar.ObtenerRaiz());
     grado    = fabricar.ObtenerGrado();
 }