예제 #1
0
        /// <summary>
        /// Слияние двух узлов.
        /// </summary>
        /// <param name="sibling">Брат, с которым происходит слияние.</param>
        public override void Merge(ArrayNode <T> sibling)
        {
            InternalArrayNode <T> node = (InternalArrayNode <T>)sibling;

            //Спускает Separator сверху
            Keys.Add(node.GetFirstLeafKey());
            Keys.AddRange(node.Keys);
            Children.AddRange(node.Children);
        }
예제 #2
0
        /// <summary>
        /// Деление узла.
        /// </summary>
        /// <returns>Появившийся в результате деления узел.</returns>
        public override ArrayNode <T> Split()
        {
            int from  = Keys.Count / 2 + 1;
            int count = Keys.Count - from;
            InternalArrayNode <T> sibling = new InternalArrayNode <T>(Factor);

            sibling.Keys.AddRange(Keys.GetRange(from, count));
            sibling.Children.AddRange(Children.GetRange(from, count + 1));

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

            _root.Add(node);

            if (_root.IsOverflow())
            {
                Level++;
                //TODO
                var sibling = _root.Split();
                var newRoot = new InternalArrayNode <T>(Factor);
                newRoot.Keys.Add(sibling.GetFirstLeafKey());
                newRoot.Children.Add(_root);
                newRoot.Children.Add(sibling);
                _root = newRoot;
            }
        }