Skip to content

Commit

Permalink
RBT(fix): update node values when swapping contents; fixes frptools#44
Browse files Browse the repository at this point in the history
  • Loading branch information
not-an-aardvark committed Jul 10, 2017
1 parent 7822de0 commit f360416
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 0 deletions.
2 changes: 2 additions & 0 deletions packages/red-black-tree/src/internals/ops.ts
Expand Up @@ -136,10 +136,12 @@ export function rotateRightLeft<K, V>(upper: PathNode<K, V>, grandParent: Node<K
export function swapNodeContents<K, V>(upper: Node<K, V>, lower: Node<K, V> /* ## DEV [[ */, tree: RedBlackTreeImpl<K, V> /* ]] ## */): void {
log(`[swapNodeContents] upper: ${keyOf(upper)}, lower: ${keyOf(lower)}`); // ## DEV ##
var key = upper.key;
var value = upper.value;
upper.key = lower.key;
upper.value = lower.value;

lower.key = key;
lower.value = value;
(<any>upper).__flag = 'swap-key'; // ## DEV ##
(<any>lower).__flag = 'swap-key'; // ## DEV ##
log(tree, false, `swap node contents; ${upper.key} <==> ${lower.key}`); // ## DEV ##
Expand Down
9 changes: 9 additions & 0 deletions packages/red-black-tree/tests/functions/remove.ts
Expand Up @@ -38,6 +38,15 @@ suite('[RedBlackTree]', () => {
}
});

test('should not update other keys after a key is removed', () => {
var tree = <RedBlackTreeImpl<number, string>>empty();
tree = <RedBlackTreeImpl<number, string>>set(1, 'one', tree);
tree = <RedBlackTreeImpl<number, string>>set(3, 'three', tree);
tree = <RedBlackTreeImpl<number, string>>set(2, 'two', tree);
tree = <RedBlackTreeImpl<number, string>>remove(2, tree);
assert.strictEqual(get(3, tree), 'three');
});

test('should preserve the red-black adjacency invariant required for red-black trees', () => {
var tree = createTree();
verifyRedBlackAdjacencyInvariant(tree);
Expand Down

0 comments on commit f360416

Please sign in to comment.