TheAlgorithms/Go · error
deleting out of bounds key
Error message
deleting out of bounds key
What it means
BTreeNode.DeleteIthKey panics when i >= numKeys: the caller asked to delete an index beyond the keys stored in the node, an internal invariant violation from B-tree Delete/Merge logic rather than user input.
Source
Thrown at structure/tree/btree.go:198
tree.root = NewBTreeNode[T](tree.maxKeys, true)
tree.root.keys[0] = key
tree.root.numKeys = 1
return
}
if tree.root.IsFull(tree.maxKeys) {
newRoot := NewBTreeNode[T](tree.maxKeys, false)
newRoot.numKeys = 0
newRoot.children[0] = tree.root
newRoot.Split(0, tree.maxKeys)
tree.root = newRoot
}
tree.root.InsertNonFull(tree, key)
}
func (node *BTreeNode[T]) DeleteIthKey(i int) {
if i >= node.numKeys {
panic("deleting out of bounds key")
}
for j := i; j < node.numKeys-1; j++ {
node.keys[j] = node.keys[j+1]
node.children[j+1] = node.children[j+2]
}
node.numKeys--
}
// Transform:
//
// A B C
// / \
// a b
//
// Into:
//
// A C
// |View on GitHub (pinned to 5ba447ec5f)
Solutions
- Fix the caller (Merge/Delete) to only pass indexes < numKeys
- Return an error instead of panicking if this is used as a public API
- Add bounds checks and unit tests covering boundary indexes in Delete
Example fix
// before
node.DeleteIthKey(i) // i may be out of range
// after
if i >= 0 && i < node.numKeys {
node.DeleteIthKey(i)
} Defensive patterns
Strategy: validation
Validate before calling
if node.numKeys == 0 || i < 0 || i >= node.numKeys {
return errors.New("key index out of range")
}
node.DeleteIthKey(i) Try / catch
func safeDeleteIth(n *BTreeNode[int], i int) (err error) {
defer func() {
if r := recover(); r != nil { err = fmt.Errorf("delete failed: %v", r) }
}()
n.DeleteIthKey(i)
return nil
} Prevention
- Recompute key indices after every mutation
- Check numKeys before deleting
- Use tree.Delete rather than manual node surgery
When it happens
Trigger: Calling node.DeleteIthKey(i) with i equal to or beyond numKeys; Merge passing an idx that is out of range after prior mutations; off-by-one in custom delete code that computes the key index.
Common situations: Direct manipulation of nodes in tests; deleting from an empty node (numKeys == 0, any i fails); stale index retained after earlier deletions shifted keys.
Related errors
- BTree maxKeys cannot be zero
- Must be >= 3 keys
- node has too few keys
- node has too many keys
- Called InsertNonFull() with a full node
AI-assisted analysis of TheAlgorithms/Go@5ba447ec5f (2026-09-02).
Data as JSON: /api/errors/14d4e3096cf3c1e2.
Report an issue: GitHub.