/// <summary> /// Рекурсивное удаление ключа из узла. Внутренние узлы /// передают управление листьевым, откуда и производится /// удаление. Возможна перестройка структуры дерева из-за /// нехватки ключей. /// </summary> /// <param name="key">Удаляемый ключ</param> /// <returns> /// Узел дерева, который станет новым корнем, если в текущем корне /// не останется ключей. /// </returns> public override TreeNode <T> Remove(T key) { TreeNode <T> child = GetChild(key); child.Remove(key); if (child.IsUnderFlow()) { TreeNode <T> childLeftSibling = GetChildLeftSibling(key); TreeNode <T> childRightSibling = GetChildRightSibling(key); TreeNode <T> left = childLeftSibling ?? child; TreeNode <T> right = childLeftSibling != null ? child : childRightSibling; left.Merge(right); DeleteChild(right); if (left.IsOverflow()) { TreeNode <T> sibling = left.Split(); InsertChild(sibling.GetFirstLeafKey(), sibling); } return(left); } int updateIndex = Keys.IndexOf(key); if (updateIndex >= 0) { Keys[updateIndex] = Children[updateIndex + 1].GetFirstLeafKey(); } return(null); }
/// <summary> /// Удаление элемента из дерева /// </summary> /// <param name="node">Удаляемый элемент</param> public void Remove(T node) { if (_root == null) { return; } var newRoot = _root.Remove(node); if (_root.IsUnderFlow()) { Level--; _root = newRoot; } }