Skip to content

RedBlackTree.from() Creates Shallow Copy Causing Original Tree Corruption When Modifying the Copy #6315

Open
@jiangshengdev

Description

@jiangshengdev

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

  1. Create a RedBlackTree with the values [3, 10, 13, 4, 6, 7, 1, 14].
  2. Use RedBlackTree.from() to create a copy of the original tree without providing a custom compare or map function.
  3. Remove the value 7 from the copied tree.
  4. 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.`);
});

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions