internal void insert(dynamic key, BPlusTree b)
        {
            if (!leaf)
            {
                bool           getIn = true;
                int            i     = 0;
                List <dynamic> l     = new List <dynamic>(keys);
                foreach (dynamic d in l)
                {
                    if (key < d)
                    {
                        getIn = false;
                        childs[i].insert(key, b);
                        break;
                    }
                    i++;
                }
                if (getIn)
                {
                    childs[i].insert(key, b);
                }
            }
            else
            {
                keys.Add(key);
                if (keys.Count == min_degree)
                {
                    List <dynamic> l = new List <dynamic>(keys);
                    if (root)
                    {
                        dynamic middle  = l[keys.Count / 2];
                        node    newRoot = new node(true, false);
                        newRoot.keys.Add(middle);
                        node left  = new node(false, true);
                        node right = new node(false, true);
                        for (int i = 0; i < keys.Count / 2; i++)
                        {
                            left.keys.Add(l[i]);
                        }
                        for (int i = keys.Count / 2; i < keys.Count; i++)
                        {
                            right.keys.Add(l[i]);
                        }
                        left.parent  = newRoot;
                        right.parent = newRoot;
                        newRoot.childs.Add(left);
                        newRoot.childs.Add(right);
                        b.setRoot(newRoot);
                    }
                    else
                    {
                        dynamic             middle = l[keys.Count / 2];
                        SortedSet <dynamic> left   = new SortedSet <dynamic>();
                        node right = new node(false, true);
                        for (int i = keys.Count / 2; i < keys.Count; i++)
                        {
                            right.keys.Add(l[i]);
                        }
                        right.parent = parent;
                        for (int i = 0; i < keys.Count / 2; i++)
                        {
                            left.Add(l[i]);
                        }
                        this.keys = left;

                        parent.parentInsert(middle, right, b);
                    }
                }
            }
        }
        private void parentInsert(dynamic key, node rright, BPlusTree b)
        {
            keys.Add(key);
            List <dynamic> l = new List <dynamic>(keys);

            childs.Insert(l.IndexOf(key) + 1, rright);
            if (keys.Count == min_degree)
            {
                if (root)
                {
                    dynamic middle  = l[keys.Count / 2];
                    node    newRoot = new node(true, false);
                    newRoot.keys.Add(middle);
                    node left  = new node(false, false);
                    node right = new node(false, false);
                    for (int i = 0; i < keys.Count / 2; i++)
                    {
                        left.keys.Add(l[i]);
                    }
                    for (int i = keys.Count / 2 + 1; i < keys.Count; i++)
                    {
                        right.keys.Add(l[i]);
                    }
                    for (int i = 0; i < childs.Count / 2; i++)
                    {
                        childs[i].parent = left;
                        left.childs.Add(childs[i]);
                    }
                    for (int i = childs.Count / 2; i < childs.Count; i++)
                    {
                        childs[i].parent = right;
                        right.childs.Add(childs[i]);
                    }
                    left.parent  = newRoot;
                    right.parent = newRoot;
                    newRoot.childs.Add(left);
                    newRoot.childs.Add(right);
                    b.setRoot(newRoot);
                }
                else
                {
                    dynamic             middle = l[keys.Count / 2];
                    SortedSet <dynamic> left   = new SortedSet <dynamic>();
                    List <node>         dick   = new List <node>();
                    node right = new node(false, false);
                    for (int i = keys.Count / 2 + 1; i < keys.Count; i++)
                    {
                        right.keys.Add(l[i]);
                    }
                    for (int i = 0; i < keys.Count / 2; i++)
                    {
                        left.Add(l[i]);
                    }
                    this.keys = left;
                    for (int i = childs.Count / 2; i < childs.Count; i++)
                    {
                        childs[i].parent = right;
                        right.childs.Add(childs[i]);
                    }
                    for (int i = 0; i < childs.Count / 2; i++)
                    {
                        childs[i].parent = this;
                        dick.Add(childs[i]);
                    }
                    this.childs  = dick;
                    right.parent = parent;
                    parent.parentInsert(middle, right, b);
                }
            }
        }
 public void setRoot(node root)
 {
     this.root = root;
 }
 public BPlusTree()
 {
     root = new node(true, true);
 }