/// <summary> /// Helper method that deletes key from a node that contains it, be this /// node a leaf node or an internal node. /// </summary> /// <param name="node">Node that contains the key.</param> /// <param name="keyToDelete">Key to be deleted.</param> /// <param name="keyIndexInNode">Index of key within the node.</param> private void DeleteKeyFromNode(BTreeNode <TK, TP> node, TK keyToDelete, int keyIndexInNode) { // if leaf, just remove it from the list of entries (we're guaranteed to have // at least "degree" # of entries, to BTree property is maintained if (node.IsLeaf) { node.Entries.RemoveAt(keyIndexInNode); return; } BTreeNode <TK, TP> predecessorChild = node.Children[keyIndexInNode]; if (predecessorChild.Entries.Count >= this.Degree) { BTreeEntry <TK, TP> predecessor = this.DeletePredecessor(predecessorChild); node.Entries[keyIndexInNode] = predecessor; } else { BTreeNode <TK, TP> successorChild = node.Children[keyIndexInNode + 1]; if (successorChild.Entries.Count >= this.Degree) { BTreeEntry <TK, TP> successor = this.DeleteSuccessor(predecessorChild); node.Entries[keyIndexInNode] = successor; } else { predecessorChild.Entries.Add(node.Entries[keyIndexInNode]); predecessorChild.Entries.AddRange(successorChild.Entries); predecessorChild.Children.AddRange(successorChild.Children); node.Entries.RemoveAt(keyIndexInNode); node.Children.RemoveAt(keyIndexInNode + 1); this.DeleteInternal(predecessorChild, keyToDelete); } } }
/// <summary></summary> /// <param name="other"></param> /// <returns></returns> public bool Equals(BTreeEntry <TK, TP> other) { return(this.Key.Equals(other.Key) && this.Pointer.Equals(other.Pointer)); }