Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
jiangshengdev opened this issue Dec 29, 2024 · 0 comments
Labels
bug Something isn't working

Comments

@jiangshengdev
Copy link
Contributor

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.`);
});
@jiangshengdev jiangshengdev added bug Something isn't working needs triage labels Dec 29, 2024
@kt3k kt3k removed the needs triage label Jan 6, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants