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

  1. Fix the caller (Merge/Delete) to only pass indexes < numKeys
  2. Return an error instead of panicking if this is used as a public API
  3. 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

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


AI-assisted analysis of TheAlgorithms/Go@5ba447ec5f (2026-09-02). Data as JSON: /api/errors/14d4e3096cf3c1e2. Report an issue: GitHub.