@@ -99,7 +99,7 @@ export default class BinarySearchTreeNode extends BinaryTreeNode {
9999 parent . removeChild ( nodeToRemove ) ;
100100 } else {
101101 // Node has no parent. Just erase current node value.
102- nodeToRemove . value = null ;
102+ nodeToRemove . setValue ( undefined ) ;
103103 }
104104 } else if ( nodeToRemove . left && nodeToRemove . right ) {
105105 // Node has two children.
@@ -108,20 +108,24 @@ export default class BinarySearchTreeNode extends BinaryTreeNode {
108108 const nextBiggerNode = nodeToRemove . right . findMin ( ) ;
109109 if ( ! this . nodeComparator . equal ( nextBiggerNode , nodeToRemove . right ) ) {
110110 this . remove ( nextBiggerNode . value ) ;
111- nodeToRemove . value = nextBiggerNode . value ;
111+ nodeToRemove . setValue ( nextBiggerNode . value ) ;
112112 } else {
113113 // In case if next right value is the next bigger one and it doesn't have left child
114114 // then just replace node that is going to be deleted with the right node.
115- nodeToRemove . value = nodeToRemove . right . value ;
116- nodeToRemove . right = nodeToRemove . right . right ;
115+ nodeToRemove . setValue ( nodeToRemove . right . value ) ;
116+ nodeToRemove . setRight ( nodeToRemove . right . right ) ;
117117 }
118118 } else {
119119 // Node has only one child.
120120 // Make this child to be a direct child of current node's parent.
121- const child = nodeToRemove . left || nodeToRemove . right ;
122- nodeToRemove . value = child . value ;
123- nodeToRemove . setLeft ( child . left ) ;
124- nodeToRemove . setRight ( child . right ) ;
121+ /** @var BinarySearchTreeNode */
122+ const childNode = nodeToRemove . left || nodeToRemove . right ;
123+
124+ if ( parent ) {
125+ parent . replaceChild ( nodeToRemove , childNode ) ;
126+ } else {
127+ BinaryTreeNode . copyNode ( childNode , nodeToRemove ) ;
128+ }
125129 }
126130
127131 return true ;
0 commit comments