Exemplo n.º 1
0
        private void Merge(BTree234Node <T> root, int index)
        {
            BTree234Node <T> left  = root.children[index];
            BTree234Node <T> right = root.children[index + 1];

            left.values[1] = root.values[index];

            left.values[2] = right.values[0];
            if (left.children[0] != null)
            {
                left.children[2] = right.children[0];
                left.children[3] = right.children[1];
            }
            root.count--;
            for (int i = index; i < root.count; i++)
            {
                root.values[i] = root.values[i + 1];
            }
            root.values[root.count] = default(T);
            for (int i = index + 1; i <= root.count; i++)
            {
                root.children[i] = root.children[i + 1];
            }
            root.children[root.count + 1] = null;
            left.count = 3;
            if (root.count == 0)
            {
                this.root = left;
            }
        }
Exemplo n.º 2
0
        private BTree234Node <T> Split(BTree234Node <T> root)
        {
            BTree234Node <T> sibling = new BTree234Node <T>();

            sibling.count     = 1;
            root.count        = 1;
            sibling.values[0] = root.values[2];
            root.values[2]    = default(T);
            if (root.children[0] != null)
            {
                sibling.children[0]        = root.children[2];
                sibling.children[0].parent = sibling;
                sibling.children[1]        = root.children[3];
                sibling.children[1].parent = sibling;
                root.children[2]           = null;
                root.children[3]           = null;
            }


            if (root.parent == null)
            {
                BTree234Node <T> parent = new BTree234Node <T>();
                parent.children[0] = root;
                parent.children[1] = sibling;
                parent.values[0]   = root.values[1];
                root.values[1]     = default(T);
                root.parent        = parent;
                sibling.parent     = parent;
                parent.count       = 1;
                this.root          = parent;
            }
            else
            {
                for (int i = 0; i < root.parent.count + 1; i++)
                {
                    if (root.parent.children[i] == root)
                    {
                        for (int j = root.parent.count; j > i; j--)
                        {
                            root.parent.children[j + 1] = root.parent.children[j];
                            root.parent.values[j]       = root.parent.values[j - 1];
                        }
                        root.parent.children[i + 1] = sibling;
                        root.parent.values[i]       = root.values[1];
                        sibling.parent = root.parent;
                        root.values[1] = default(T);
                        root.parent.count++;
                        break;
                    }
                }
            }
            return(root.parent);
        }
Exemplo n.º 3
0
 public void Insert(T item)
 {
     if (root == null)
     {
         root           = new BTree234Node <T>();
         root.values[0] = item;
         root.count     = 1;
     }
     else
     {
         Insert(item, root);
     }
 }
Exemplo n.º 4
0
        private string InOrder(BTree234Node <T> root)
        {
            if (root == null)
            {
                return("");
            }
            string output = "";

            for (int i = 0; i < root.count; i++)
            {
                output += InOrder(root.children[i]) + root.values[i] + " ";
            }
            return(output + InOrder(root.children[root.count]));
        }
Exemplo n.º 5
0
 public void Delete(T item)
 {
     if (root != null)
     {
         if (root.children[0] == null && root.count == 1 && root.values[0].CompareTo(item) == 0)
         {
             root = null;
         }
         else
         {
             Delete(item, root);
         }
     }
 }
Exemplo n.º 6
0
        private void GrowNode(BTree234Node <T> root, int index)
        {
            BTree234Node <T> child = root.children[index];

            if (index > 0 && root.children[index - 1].count > 1)
            {
                BTree234Node <T> sibling = root.children[index - 1];
                child.values[1]                   = child.values[0];
                child.values[0]                   = root.values[index - 1];
                root.values[index - 1]            = sibling.values[sibling.count - 1];
                sibling.values[sibling.count - 1] = default(T);
                child.children[2]                 = child.children[1];
                child.children[1]                 = child.children[0];
                child.children[0]                 = sibling.children[sibling.count];
                sibling.children[sibling.count]   = null;
                sibling.count--;
                child.count++;
            }
            else if (index < root.count - 1 && root.children[index + 1].count > 1)
            {
                BTree234Node <T> sibling = root.children[index + 1];
                child.values[1]    = root.values[index];
                root.values[index] = sibling.values[0];
                for (int i = 0; i < sibling.count - 1; i++)
                {
                    sibling.values[i] = sibling.values[i + 1];
                }
                sibling.values[sibling.count - 1] = default(T);
                child.children[2] = sibling.children[0];
                for (int i = 0; i < sibling.count - 1; i++)
                {
                    sibling.children[i] = sibling.children[i + 1];
                }
                sibling.children[sibling.count] = null;
                sibling.count--;
                child.count++;
            }
            else
            {
                if (index != root.count)
                {
                    Merge(root, index);
                }
                else
                {
                    Merge(root, index - 1);
                }
            }
        }
Exemplo n.º 7
0
 private void Insert(T item, BTree234Node <T> root)
 {
     if (root.count >= 3)
     {
         root = Split(root);
     }
     if (root.children[0] != null)
     {
         for (int i = 0; i < root.count; i++)
         {
             if (item.CompareTo(root.values[i]) < 0)
             {
                 Insert(item, root.children[i]);
                 return;
             }
             else if (item.CompareTo(root.values[i]) == 0)
             {
                 return;
             }
         }
         Insert(item, root.children[root.count]);
     }
     else
     {
         for (int i = 0; i < root.count; i++)
         {
             if (item.CompareTo(root.values[i]) < 0)
             {
                 for (int j = root.count; j > i; j--)
                 {
                     root.values[j] = root.values[j - 1];
                 }
                 root.values[i] = item;
                 root.count++;
                 return;
             }
             else if (item.CompareTo(root.values[i]) == 0)
             {
                 return;
             }
         }
         root.values[root.count] = item;
         root.count++;
     }
 }
Exemplo n.º 8
0
 private bool Find(T item, BTree234Node <T> root)
 {
     if (root == null)
     {
         return(false);
     }
     for (int i = 0; i < root.count; i++)
     {
         if (item.CompareTo(root.values[i]) == 0)
         {
             return(true);
         }
         if (item.CompareTo(root.values[i]) < 0)
         {
             return(Find(item, root.children[i]));
         }
     }
     return(Find(item, root.children[root.count]));
 }
Exemplo n.º 9
0
 private void DeleteNode(BTree234Node <T> root, int index)
 {
     if (root.children[0] == null)
     {
         root.count--;
         for (int i = index; i < root.count; i++)
         {
             root.values[i] = root.values[i + 1];
         }
         root.values[root.count] = default(T);
     }
     else if (root.children[index].count > 1)
     {
         BTree234Node <T> child = root.children[index];
         while (child.children[0] != null)
         {
             Console.WriteLine(child.children[child.count]);
             child = child.children[child.count];
             Console.WriteLine(child.values[child.count - 1]);
         }
         root.values[index] = child.values[child.count - 1];
         DeleteNode(child, child.count - 1);
     }
     else if (root.children[index + 1].count > 1)
     {
         BTree234Node <T> child = root.children[index + 1];
         while (child.children[0] != null)
         {
             child = child.children[0];
         }
         root.values[index] = child.values[0];
         DeleteNode(child, 0);
     }
     else
     {
         Merge(root, index);
         DeleteNode(root.children[index], 1);
     }
 }
Exemplo n.º 10
0
 private void Delete(T item, BTree234Node <T> root)
 {
     if (root == null)
     {
         return;
     }
     for (int i = 0; i <= root.count; i++)
     {
         if (i < root.count && item.CompareTo(root.values[i]) == 0)
         {
             DeleteNode(root, i);
             return;
         }
         else if (i == root.count || item.CompareTo(root.values[i]) < 0)
         {
             if (root.children[0] != null && root.children[i].count == 1)
             {
                 GrowNode(root, i);
             }
             Delete(item, root.children[i]);
             return;
         }
     }
 }