예제 #1
0
        /// <summary>
        /// Деление узла.
        /// </summary>
        /// <returns>Появившийся в результате деления узел.</returns>
        public override TreeNode <T> Split()
        {
            int          from    = Keys.Count / 2;
            int          count   = Keys.Count - from;
            LeafNode <T> sibling = Factory.CreateLeafNode(Factor);

            sibling.Keys.AddRange(Keys.GetRange(from, count));
            Keys         = Keys.GetRange(0, from);
            sibling.Next = Next;
            Next         = sibling;
            return(sibling);
        }
예제 #2
0
        /// <summary>
        /// Добавление элемента в дерево
        /// </summary>
        /// <param name="node">Элемент</param>
        public void Add(T node)
        {
            if (_root == null)
            {
                Level++;
                _root = Factory.CreateLeafNode(Factor);
            }

            _root.Add(node);

            if (_root.IsOverflow())
            {
                Level++;
                var sibling = _root.Split();
                var newRoot = Factory.CreateInternalNode(Factor);
                newRoot.Keys.Add(sibling.GetFirstLeafKey());
                newRoot.Children.Add(_root);
                newRoot.Children.Add(sibling);
                _root = newRoot;
            }
        }