private static Leaf <K, V> GetLeafThatMayContainKey(K key, Node <K, V> node) { while ((node = InternalNode <K, V> .ChooseSubtree(key, node)) is InternalNode <K, V> ) { } var leaf = node as Leaf <K, V>; return(leaf); }
public void Insert(K key, V value) { Node <K, V> newNode = null; K pivotElement = default(K); Root.Insert(key, value, out newNode, out pivotElement); if (newNode != null) { if (Root is Leaf <K, V> || Root.KeyIndex < _lastRootIndex) { var newRoot = new InternalNode <K, V>(MaxDegree - 1); newRoot.AddKeyChild(pivotElement, Root); newRoot.Children[1] = newNode; Root = newRoot; } else { (Root as InternalNode <K, V>).AddKeyChild(key, newNode); } } _lastRootIndex = Root.KeyIndex; Count++; }
private void Split(K key, Node <K, V> newChildNode, out Node <K, V> rightNode, out K midElement) { // TODO Do split without addition buffer K[] keyBuf = new K[Keys.Length + 1]; var childBuf = new Node <K, V> [Keys.Length + 2]; bool isKeyInserted = false; K newChildMinKey = newChildNode.Keys[0]; bool isNewChildNodeInserted = false; int k = 0; for (int i = 0, j = 0; i < keyBuf.Length; i++, k++) { if (!isNewChildNodeInserted && newChildMinKey.CompareTo(Children[i].Keys[0]) < 0) { childBuf[k] = newChildNode; isNewChildNodeInserted = true; childBuf[k + 1] = Children[i]; k++; } else { childBuf[k] = Children[i]; } if (j < Keys.Length && key.CompareTo(Keys[j]) < 0 && !isKeyInserted) { keyBuf[i] = key; isKeyInserted = true; } else { if (j < Keys.Length) { keyBuf[i] = Keys[j]; } j++; } } if (k != childBuf.Length) { if (isNewChildNodeInserted) { childBuf[k] = Children[Children.Length - 1]; } else { childBuf[k] = newChildNode; } } if (isKeyInserted) { keyBuf[keyBuf.Length - 1] = Keys[Keys.Length - 1]; } else { keyBuf[keyBuf.Length - 1] = key; } int midIndex = keyBuf.Length / 2; midElement = keyBuf[midIndex]; K[] rightKeys = new K[Keys.Length]; Node <K, V>[] rightNodes = new Node <K, V> [Keys.Length + 1]; int rightIndex = 0; for (int i = midIndex + 1; i < keyBuf.Length; i++, rightIndex++) { rightKeys[rightIndex] = keyBuf[i]; } for (int i = midIndex + 1, j = 0; i < childBuf.Length; i++, j++) { rightNodes[j] = childBuf[i]; } rightNode = new InternalNode <K, V>(rightIndex - 1, rightKeys, rightNodes); int leftIndex = 0; for (int i = 0; i < Keys.Length; i++) { if (i < midIndex) { Keys[leftIndex] = keyBuf[i]; leftIndex++; } else { Keys[leftIndex] = default(K); // TODO Fix it after debugging } } KeyIndex = leftIndex - 1; for (int i = 0; i < Children.Length; i++) { if (i <= midIndex) { Children[i] = childBuf[i]; } else { Children[i] = default(Node <K, V>); // TODO Fix it after debugging } } }