Exemple #1
0
        private void InsertNonFull(Node x, IFile k)
        {
            int index = x.n - 1;

            if (x.leaf)
            {
                while (index >= 0 && comparer(k, x.key[index]) < 0)
                {
                    x.key[index + 1] = x.key[index];
                    index--;
                }
                x.key[index + 1] = k;
                x.n++;
                manager.DiskWrite(x);
            }
            else
            {
                while (index >= 0 && comparer(k, x.key[index]) < 0)
                {
                    index--;
                }
                index++;
                Node child = manager.DiskRead(x.c[index]);
                if (child.n == 2 * t - 1)
                {
                    SplitChild(child, x, index);
                    if (comparer(k, x.key[index]) >= 0)
                    {
                        child = manager.DiskRead(x.c[index + 1]);
                    }
                }
                InsertNonFull(child, k);
            }
        }
Exemple #2
0
 public BTree(int t, Func <IFile, IFile, int> comparer, StreamManager manager)
 {
     this.t = t;
     manager.OpenStream();
     this.manager  = manager;
     this.comparer = comparer;
     root          = AllocateNode();
     root.leaf     = true;
     manager.UpdateRoot(root.offset, Array.IndexOf(MyFinder.comparer, comparer));
     manager.DiskWrite(root);
 }