@@ -6,6 +6,7 @@ export default class BinarySearchTree {
6
6
this . compareFn = compareFn ;
7
7
this . root = undefined ;
8
8
}
9
+
9
10
insert ( key ) {
10
11
// special case: first key
11
12
if ( this . root == null ) {
@@ -14,6 +15,7 @@ export default class BinarySearchTree {
14
15
this . insertNode ( this . root , key ) ;
15
16
}
16
17
}
18
+
17
19
insertNode ( node , key ) {
18
20
if ( this . compareFn ( key , node . key ) === Compare . LESS_THAN ) {
19
21
if ( node . left == null ) {
@@ -27,84 +29,99 @@ export default class BinarySearchTree {
27
29
this . insertNode ( node . right , key ) ;
28
30
}
29
31
}
32
+
30
33
getRoot ( ) {
31
34
return this . root ;
32
35
}
36
+
33
37
search ( key ) {
34
38
return this . searchNode ( this . root , key ) ;
35
39
}
40
+
36
41
searchNode ( node , key ) {
37
42
if ( node == null ) {
38
43
return false ;
39
44
}
40
45
if ( this . compareFn ( key , node . key ) === Compare . LESS_THAN ) {
41
46
return this . searchNode ( node . left , key ) ;
42
- } else if ( this . compareFn ( key , node . key ) === Compare . BIGGER_THAN ) {
47
+ } if ( this . compareFn ( key , node . key ) === Compare . BIGGER_THAN ) {
43
48
return this . searchNode ( node . right , key ) ;
44
49
}
45
50
return true ;
46
51
}
52
+
47
53
inOrderTraverse ( callback ) {
48
54
this . inOrderTraverseNode ( this . root , callback ) ;
49
55
}
56
+
50
57
inOrderTraverseNode ( node , callback ) {
51
58
if ( node != null ) {
52
59
this . inOrderTraverseNode ( node . left , callback ) ;
53
60
callback ( node . key ) ;
54
61
this . inOrderTraverseNode ( node . right , callback ) ;
55
62
}
56
63
}
64
+
57
65
preOrderTraverse ( callback ) {
58
66
this . preOrderTraverseNode ( this . root , callback ) ;
59
67
}
68
+
60
69
preOrderTraverseNode ( node , callback ) {
61
70
if ( node != null ) {
62
71
callback ( node . key ) ;
63
72
this . preOrderTraverseNode ( node . left , callback ) ;
64
73
this . preOrderTraverseNode ( node . right , callback ) ;
65
74
}
66
75
}
76
+
67
77
postOrderTraverse ( callback ) {
68
78
this . postOrderTraverseNode ( this . root , callback ) ;
69
79
}
80
+
70
81
postOrderTraverseNode ( node , callback ) {
71
82
if ( node != null ) {
72
83
this . postOrderTraverseNode ( node . left , callback ) ;
73
84
this . postOrderTraverseNode ( node . right , callback ) ;
74
85
callback ( node . key ) ;
75
86
}
76
87
}
88
+
77
89
min ( ) {
78
90
return this . minNode ( this . root ) ;
79
91
}
92
+
80
93
minNode ( node ) {
81
94
let current = node ;
82
95
while ( current != null && current . left != null ) {
83
96
current = current . left ;
84
97
}
85
98
return current ;
86
99
}
100
+
87
101
max ( ) {
88
102
return this . maxNode ( this . root ) ;
89
103
}
104
+
90
105
maxNode ( node ) {
91
106
let current = node ;
92
107
while ( current != null && current . right != null ) {
93
108
current = current . right ;
94
109
}
95
110
return current ;
96
111
}
112
+
97
113
remove ( key ) {
98
114
this . root = this . removeNode ( this . root , key ) ;
99
115
}
116
+
100
117
removeNode ( node , key ) {
101
118
if ( node == null ) {
102
119
return undefined ;
103
120
}
104
121
if ( this . compareFn ( key , node . key ) === Compare . LESS_THAN ) {
105
122
node . left = this . removeNode ( node . left , key ) ;
106
123
return node ;
107
- } else if ( this . compareFn ( key , node . key ) === Compare . BIGGER_THAN ) {
124
+ } if ( this . compareFn ( key , node . key ) === Compare . BIGGER_THAN ) {
108
125
node . right = this . removeNode ( node . right , key ) ;
109
126
return node ;
110
127
}
@@ -122,7 +139,7 @@ export default class BinarySearchTree {
122
139
if ( node . left == null ) {
123
140
node = node . right ;
124
141
return node ;
125
- } else if ( node . right == null ) {
142
+ } if ( node . right == null ) {
126
143
node = node . left ;
127
144
return node ;
128
145
}
0 commit comments