/// <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); }
/// <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); }
/// <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; } }