/// <summary> /// Деление узла. /// </summary> /// <returns>Появившийся в результате деления узел.</returns> public override TreeNode <T> Split() { int from = Keys.Count / 2 + 1; int count = Keys.Count - from; InternalNode <T> sibling = Factory.CreateInternalNode(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); }
/// <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; } }