@@ -16,6 +16,48 @@ export default class AvlTree extends BinarySearchTree {
16
16
}
17
17
}
18
18
19
+ remove ( value ) {
20
+ const nodeToRemove = this . root . find ( value ) ;
21
+
22
+ if ( ! nodeToRemove ) {
23
+ throw new Error ( 'Item not found in the tree' ) ;
24
+ }
25
+
26
+ // Recursively find target node, if found then delete and balance.
27
+ // return nodeToRemove.value;
28
+ this . root = this . removeRecv ( this . root , nodeToRemove ) ;
29
+ }
30
+
31
+ removeRecv ( origin , node ) {
32
+ let newOrigin = origin ;
33
+ if ( origin . value > node . value ) {
34
+ // Recursively traversing from left
35
+ newOrigin . left = this . removeRecv ( origin . left , node ) ;
36
+ } else if ( origin . value < node . value ) {
37
+ // Recursively traversing from right
38
+ newOrigin . right = this . removeRecv ( origin . right , node ) ;
39
+ } else {
40
+ if ( origin . left == null ) {
41
+ // Forget right node
42
+ return origin . right ;
43
+ }
44
+ if ( origin . right == null ) {
45
+ // Forget left node
46
+ return origin . left ;
47
+ }
48
+
49
+ // Recursively find min node from left subtree
50
+ // more efficient traversing
51
+ const parent = Object . assign ( { } , origin ) ;
52
+ newOrigin = parent . right . findMin ( ) ;
53
+ newOrigin . right = this . deleteMin ( parent . right ) ;
54
+ newOrigin . left = parent . left ;
55
+ }
56
+
57
+ // Balance and return root node
58
+ return this . balance ( newOrigin ) ;
59
+ }
60
+
19
61
/**
20
62
* @param {* } value
21
63
* @return {boolean }
@@ -48,6 +90,8 @@ export default class AvlTree extends BinarySearchTree {
48
90
this . rotateRightLeft ( node ) ;
49
91
}
50
92
}
93
+ // Return the heap to avoid referenceError
94
+ return node ;
51
95
}
52
96
53
97
/**
@@ -156,4 +200,15 @@ export default class AvlTree extends BinarySearchTree {
156
200
// Attach rootNode to the left of rightNode.
157
201
rightNode . setLeft ( rootNode ) ;
158
202
}
203
+
204
+ deleteMin ( node ) {
205
+ // Forget right node if has value
206
+ if ( node . left == null ) return node . right ;
207
+
208
+ const newNode = node ;
209
+ newNode . left = this . deleteMin ( node . left ) ;
210
+
211
+ // Balance and return root node
212
+ return this . balance ( newNode ) ;
213
+ }
159
214
}
0 commit comments