trekhleb/javascript-algorithms · error · Error

Can't remove ${value}. Remove method is not implemented yet

Error message

Can't remove ${value}. Remove method is not implemented yet

What it means

RedBlackTree in this repository implements insertion and rebalancing but deliberately leaves deletion unimplemented: remove(value) unconditionally throws for every value. It is a documented-in-code limitation of an educational codebase, not a runtime condition you can influence — no argument, state, or configuration makes this method succeed. Any code path that deletes from a RedBlackTree will hit it.

Source

Thrown at src/data-structures/tree/red-black-tree/RedBlackTree.js:40

      // Make root to always be black.
      this.makeNodeBlack(insertedNode);
    } else {
      // Make all newly inserted nodes to be red.
      this.makeNodeRed(insertedNode);
    }

    // Check all conditions and balance the node.
    this.balance(insertedNode);

    return insertedNode;
  }

  /**
   * @param {*} value
   * @return {boolean}
   */
  remove(value) {
    throw new Error(`Can't remove ${value}. Remove method is not implemented yet`);
  }

  /**
   * @param {BinarySearchTreeNode} node
   */
  balance(node) {
    // If it is a root node then nothing to balance here.
    if (this.nodeComparator.equal(node, this.root)) {
      return;
    }

    // If the parent is black then done. Nothing to balance here.
    if (this.isNodeBlack(node.parent)) {
      return;
    }

    const grandParent = node.parent.parent;

View on GitHub (pinned to 85293e3e2b)

Solutions

  1. Switch to AvlTree (also self-balancing, same insert/find surface) or plain BinarySearchTree — both implement remove().
  2. If you must keep a RedBlackTree, rebuild without the element: traverse values, filter out the target, and re-insert into a fresh tree.
  3. Implement red-black deletion yourself in a subclass and override remove(), or fork the file — upstream ships no version where this method works.
  4. Audit other methods you depend on before adopting a structure from this repo; stubs are marked by throw statements like this one.

Example fix

// before
import RedBlackTree from './data-structures/tree/red-black-tree/RedBlackTree';
const tree = new RedBlackTree();
tree.insert(1);
tree.remove(1); // throws: Remove method is not implemented yet

// after
import AvlTree from './data-structures/tree/avl-tree/AvlTree';
const tree = new AvlTree();
tree.insert(1);
tree.remove(1); // works, tree stays balanced
Defensive patterns

Strategy: fallback

Validate before calling

import RedBlackTree from './data-structures/tree/red-black-tree/RedBlackTree';

const treeSupportsRemove = (tree) => !(tree instanceof RedBlackTree);

function deleteFrom(tree, value) {
  if (!treeSupportsRemove(tree)) {
    // fallback: collect values, filter out the target, re-insert into an AvlTree
    return null; // replace with the rebuild appropriate for your data
  }
  return tree.remove(value);
}

Type guard

const treeSupportsRemove = (tree) => !(tree instanceof RedBlackTree);

Try / catch

try {
  tree.remove(value);
} catch (e) {
  if (e.message.includes('Remove method is not implemented yet')) {
    // fallback path: switch to AvlTree, or filter-and-reinsert into a fresh tree
  } else {
    throw e;
  }
}

Prevention

When it happens

Trigger: Calling tree.remove(value) on any RedBlackTree instance with any value; generic algorithms written against BinarySearchTree being handed a RedBlackTree, since remove() exists on the inherited interface and only fails at call time; tests copied from BinarySearchTree/AvlTree suites being run against RedBlackTree.

Common situations: Choosing RedBlackTree for its O(log n) guarantees and assuming the full CRUD surface exists; swapping an AvlTree import for RedBlackTree during a refactor; integrating this educational library into production code without auditing which methods are stubs.

Related errors


AI-assisted analysis of trekhleb/javascript-algorithms@85293e3e2b (2026-08-24). Data as JSON: /api/errors/d8949c0aa281bc45. Report an issue: GitHub.