diff --git a/src/data-structures/tree/binary-search-tree/BinarySearchTreeNode.js b/src/data-structures/tree/binary-search-tree/BinarySearchTreeNode.js index 9ad74483..06d99e43 100644 --- a/src/data-structures/tree/binary-search-tree/BinarySearchTreeNode.js +++ b/src/data-structures/tree/binary-search-tree/BinarySearchTreeNode.js @@ -94,8 +94,13 @@ export default class BinarySearchTreeNode extends BinaryTreeNode { if (!nodeToRemove.left && !nodeToRemove.right) { // Node is a leaf and thus has no children. - // Just remove the pointer to this node from the parent node. - parent.removeChild(nodeToRemove); + if (parent) { + // Node has a parent. Just remove the pointer to this node from the parent. + parent.removeChild(nodeToRemove); + } else { + // Node has no parent. Just erase current node value. + nodeToRemove.value = null; + } } else if (nodeToRemove.left && nodeToRemove.right) { // Node has two children. // Find the next biggest value (minimum value in the right branch) @@ -113,11 +118,10 @@ export default class BinarySearchTreeNode extends BinaryTreeNode { } else { // Node has only one child. // Make this child to be a direct child of current node's parent. - if (nodeToRemove.left) { - parent.replaceChild(nodeToRemove, nodeToRemove.left); - } else { - parent.replaceChild(nodeToRemove, nodeToRemove.right); - } + const child = nodeToRemove.left || nodeToRemove.right; + nodeToRemove.value = child.value; + nodeToRemove.setLeft(child.left); + nodeToRemove.setRight(child.right); } return true; diff --git a/src/data-structures/tree/binary-search-tree/__test__/BinarySearchTreeNode.test.js b/src/data-structures/tree/binary-search-tree/__test__/BinarySearchTreeNode.test.js index a353c1f1..63b9d999 100644 --- a/src/data-structures/tree/binary-search-tree/__test__/BinarySearchTreeNode.test.js +++ b/src/data-structures/tree/binary-search-tree/__test__/BinarySearchTreeNode.test.js @@ -185,6 +185,21 @@ describe('BinarySearchTreeNode', () => { expect(bstRootNode.toString()).toBe('30'); }); + it('should remove node with no parent', () => { + const bstRootNode = new BinarySearchTreeNode(); + expect(bstRootNode.toString()).toBe(''); + + bstRootNode.insert(1); + bstRootNode.insert(2); + expect(bstRootNode.toString()).toBe('1,2'); + + bstRootNode.remove(1); + expect(bstRootNode.toString()).toBe('2'); + + bstRootNode.remove(2); + expect(bstRootNode.toString()).toBe(''); + }); + it('should throw error when trying to remove not existing node', () => { const bstRootNode = new BinarySearchTreeNode();