Ejemplo n.º 1
0
        public void Delete(BNode <T> root, T value, int pos, int idParent)
        {
            if (Contains(root, value))
            {
                var posValues = IndexOf(root.Values, value);//
                if (IsLeaf(root))
                {
                    root.Values.RemoveAt(posValues);
                    if (IsUnderflow(root))
                    {
                        Balance(root);
                    }
                    else
                    {
                        Fm.WriteNode(root);
                    }
                    return;
                }
                else
                {
                    var newRoot = GetNode(root.Childs[posValues]);
                    Delete(newRoot, value, 0, root.Id);

                    newRoot = GetNode(root.Id);
                    if (IsUnderflow(newRoot))
                    {
                        Balance(newRoot);
                    }
                    return;
                }
            }
            else if (!IsLeaf(root))
            {
                if ((int)Comparer.DynamicInvoke(value, root.Values[pos]) == -1)
                {
                    BNode <T> newRoot;
                    newRoot = GetNode(root.Childs[pos]);
                    Delete(newRoot, value, 0, idParent);

                    newRoot = GetNode(root.Id);
                    if (IsUnderflow(newRoot))
                    {
                        Balance(newRoot);
                    }
                }
                else if ((int)Comparer.DynamicInvoke(value, root.Values[pos]) == 1)
                {
                    pos++;
                    if (pos < root.Values.Count)
                    {
                        Delete(root, value, pos, idParent);
                    }
                    else
                    {
                        BNode <T> newRoot;
                        newRoot = GetNode(root.Childs[pos]);
                        Delete(newRoot, value, 0, idParent);

                        newRoot = GetNode(root.Id);
                        if (IsUnderflow(newRoot))
                        {
                            Balance(newRoot);
                        }
                    }
                }
                return;
            }
            else
            {
                if ((int)Comparer.DynamicInvoke(value, root.Values[root.Values.Count - 1]) == 1)
                {
                    var valueSuplit = root.Values[root.Values.Count - 1];       //obtengo ultimo valor
                    root.Values.Remove(valueSuplit);                            //quito de la hoja
                    var changeInParent = GetNode(idParent);                     //llamo al padre donde sustituire
                    var posDel         = IndexOf(changeInParent.Values, value); //index del valor eliminado
                    changeInParent.Values.RemoveAt(posDel);                     //elimino de la raiz sonde se quedo contenido
                    changeInParent.Values.Insert(posDel, valueSuplit);          //incerto el valor en la raiz donde lo encontre
                    Fm.WriteNode(changeInParent);

                    if (IsUnderflow(root))
                    {
                        root.Father = changeInParent.Id;
                        Balance(root);
                    }
                    else
                    {
                        Fm.WriteNode(root);
                    }

                    return;
                }
                return; //caso en el que no se encontro el valor eliminado
            }
        }
Ejemplo n.º 2
0
        public bool Exist(T value)
        {
            BNode <T> nodef = Fm.CastNode(Root);

            return(Exist(nodef, value));
        }
Ejemplo n.º 3
0
        private void SplitParent(BNode <T> parentToSplit)
        {
            var middleValPos = (Grade - 1) / 2;
            var middleValue  = parentToSplit.Values[middleValPos];

            BNode <T> parent;
            BNode <T> newParent = new BNode <T>(Grade);

            if (parentToSplit.Father == -1)
            {
                parent = new BNode <T>(Grade)
                {
                    Father = -1, Id = SetNextId()
                };
                newParent.Father = parent.Id;
                newParent.Id     = SetNextId();
                UpdateTree(parent.Id, Next_Id);
                parentToSplit.Father = parent.Id;

                newParent.Childs.Add(-1);

                parent.Childs.RemoveAt(0);
                parent.Childs.Insert(0, parentToSplit.Id);

                parent.Values.Add(middleValue);
                SortNode(parent);
            }
            else
            {
                parent = GetNode(parentToSplit.Father);

                newParent.Father = parentToSplit.Father;
                newParent.Id     = SetNextId();

                newParent.Childs.Add(-1);

                parent.Values.Add(middleValue);
                SortNode(parent);
            }

            //Extraer valores mayores del nodo y los agrega ala nueva hoja
            for (int i = (middleValPos + 1); i < parentToSplit.Values.Count; i++)
            {
                newParent.Values.Add(parentToSplit.Values[i]);
            }
            // Quita los valores desde la mitad hasta el ultimo mayor
            while (middleValPos != parentToSplit.Values.Count)
            {
                parentToSplit.Values.RemoveAt(middleValPos);
            }
            // pasa  los hijos desde la mitad hasta el ultimo
            for (int i = 0; i < parentToSplit.Childs.Count; i++)
            {
                newParent.Childs.RemoveAt(i);
                newParent.Childs.Insert(i, parentToSplit.Childs[middleValPos + 1]);
                parentToSplit.Childs.RemoveAt(middleValPos + 1);
                parentToSplit.Childs.Add(-1);
            }
            BNode <T> tempNode;

            foreach (var item in newParent.Childs)
            {
                if (item != -1)
                {
                    tempNode        = GetNode(item);
                    tempNode.Father = newParent.Id;
                    removeChild(tempNode);
                    Fm.WriteNode(tempNode);
                }
            }

            SortChilds(parent, newParent.Id, middleValue);

            removeChild(parentToSplit);
            removeChild(parent);
            removeChild(newParent);

            Fm.WriteNode(parentToSplit);
            Fm.WriteNode(parent);
            Fm.WriteNode(newParent);
        }