Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Рекурсивное добавление ключа в узел. Внутренние узлы
        /// передают управление листьевым, где и производится
        /// добавление. Возможна перестройка структуры дерева из-за
        /// переполнения ключей.
        /// </summary>
        /// <param name="key">Добавляемый ключ.</param>
        public override void Add(T key)
        {
            TreeNode <T> child = GetChild(key);

            child.Add(key);
            if (child.IsOverflow())
            {
                TreeNode <T> sibling = child.Split();
                InsertChild(sibling.GetFirstLeafKey(), sibling);
            }
        }
Exemplo n.º 3
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;
            }
        }