Open
Description
Describe the bug
The RedBlackTree.from()
method creates a shallow copy of the original tree. When a node is removed from the copied tree, it inadvertently corrupts the original tree, leading to unexpected behavior.
Steps to Reproduce
- Create a RedBlackTree with the values
[3, 10, 13, 4, 6, 7, 1, 14]
. - Use
RedBlackTree.from()
to create a copy of the original tree without providing a customcompare
ormap
function. - Remove the value
7
from the copied tree. - Attempt to find the value
7
in the original tree.
Expected behavior
Removing a node from the copied tree should not affect the original tree. The original tree should still contain the value 7
after the removal operation on the copy.
Environment
- OS: MacOS 15.1.1
- Deno version: 2.0.3
- std version:
{ "name": "@std/data-structures", "version": "1.0.5" }
Test Case
Deno.test("RedBlackTree.from() bug demo - removing in copy corrupts original", () => {
// 1. Build the original tree
const values = [3, 10, 13, 4, 6, 7, 1, 14];
const original = RedBlackTree.from(values);
// original should have 8 elements and include 7
// 2. Create a copy without passing compare/map
const copy = RedBlackTree.from(original);
// copy and original should be independent trees
// 3. Remove value 7 from the copy
const removedInCopy = 7;
const removeResult = copy.remove(removedInCopy);
// If all is well, removing 7 from copy should not affect original
// 4. Original tree should still find 7
const stillInOriginal = original.find(removedInCopy);
// Assertion: original should still contain 7
assertStrictEquals(stillInOriginal !== null, true, `Expected original.find(${removedInCopy}) to not be null, but got null.`);
// Additionally, check if removeResult is true
assertStrictEquals(removeResult, true, `Expected copy.remove(${removedInCopy}) to return true, but got false.`);
});