-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathBinarySearchTree.java
312 lines (310 loc) · 7.31 KB
/
BinarySearchTree.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
//*******************************************************
// BinarySearchTree.java
// A class that represents an implementation of binary search tree in java
// Author: liron mizrahi
//*******************************************************
public class BinarySearchTree
{
private Node _root;
/**
* constructor of the class
* @param None
* @return None
*/
public BinarySearchTree()
{
_root = null;
}// end of method BinarySearchTree
/**
* getMinValue return the min value in the BST
* @param None
* @return int
*/
public int getMinValue(Node node)
{
Node curr = node;
while(curr._left != null)
{
curr = curr._left;
}
return curr._key;
}// end of method getMinValue
/**
* getMaxValue return the max value in the BST
* @param None
* @return int
*/
public int getMaxValue(Node node)
{
Node curr = node;
while(curr._right != null)
{
curr = curr._right;
}
return curr._key;
}// end of method getMaxValue
/**
* insert method insert a key to the BST
* @param int
* @return None
*/
public void insert(int key)
{
_root = insert(_root, key);
}// end of method insert
/**
* search method will search if the key is exists in the BST
* @param int
* @return Node
*/
public Node search(int key)
{
return search(_root, key);
}// end of method search
/**
* delete method will delete a node if exists in the BST
* @param int
* @return Node
*/
public Node delete(int key)
{
return delete(_root, key);
}// end of method delete
/**
* findCeil method will find the smalest key in the tree thet greater or equal to the tree
* @param int
* @return int
*/
public int findCeil(int input)
{
return findCeil(_root, input);
}// end of method findCeil
/**
* findFloor method will delete a node if exists in the BST
* @param int
* @return int
*/
public int findFloor(int input)
{
return findFloor(_root, input);
}// end of method findFloor
// private methods
/**
* private insert method insert a key to the BST
* @param Node, int
* @return Node
*/
private Node insert(Node node, int key)
{
if(_root == null)
{
_root = new Node(key);
return _root;
}
if (node._key > key)
{
node._left = insert(node._left, key);
}
else
{
node._right = insert(node._right, key);
}
return node;
}// end of method insert
/**
* private search method will search if the key is exists in the BST
* @param Node, int
* @return Node
*/
private Node search(Node node, int key)
{
// if key not in tree
if (node == null)
{
return null;
}
// if found key
if (node._key == key)
{
return node;
}
else if( node._key > key)
{
return search(node._left, key);
}
else
{
return search(node._right, key);
}
}// end of method search
/**
* private delete method will delete a node if exists in the BST
* @param Node, int
* @return Node
*/
private Node delete(Node node, int key)
{
if (node == null) // the key not in tree
{
return null;
}
if (node._key > key)
{
node._left = delete(node._left, key);
}
else if(node._key < key)
{
node._right = delete(node._right, key);
}
else // we found target node
{
// case 1: node is a leaf
if( node._right == null && node._left == null)
{
return null;
}
// case 2: node has 1 subtree
if (node._right == null)
{
return node._left;
}
else if(node._right == null)
{
return node._left;
}
// case 3: node has both subtrees
int replaceKey = getMinValue(node._right);
node._key = replaceKey;
node._right = delete(node._right, key);
}
return node;
}// end of method delete
/**
* private findCeil method will find the smalest key in the tree thet greater or equal to the tree
* @param int
* @return int
*/
private int findCeil(Node node, int input)
{
if (node == null)
{
return -1;
}
if( node._key == input)
{
return node._key;
}
if(node._key < input)
{
return findCeil(node._right, input);
}
int ceil = findCeil(node._left, input);
if(ceil >= input)
{
return ceil;
}
else
{
return node._key;
}
}// end of method findCeil
/**
* private findFloor method will find the biggest key in the tree thet greater or equal to the tree
* @param int
* @return int
*/
private int findFloor(Node node, int input)
{
if (node == null)
{
return -1;
}
if(node._key == input)
{
return node._key;
}
if(node._key > input)
{
return findFloor(node._left, input);
}
int floor = findFloor(node._right, input);
if (floor >= node._key)
{
return floor;
}
return node._key;
}// end of method findFloor
// traversal methods for BST
/**
* printPostOrder method will print the values in the tree in post order
* @param None
* @return None
*/
public void printPostOrder()
{
printPostOrder(_root);
}// end of method printPostOrder
/**
* printPreOrder method will print the values in the tree in pre order
* @param None
* @return None
*/
public void printPreOrder()
{
printPreOrder(_root);
}// end of method printPreOrder
/**
* printInOrder method will print the values in the tree in InOrder
* @param None
* @return None
*/
public void printInOrder()
{
printInOrder(_root);
}// end of method printInOrder
/**
* private printPostOrder method will print the values in the tree in post order
* @param None
* @return None
*/
private void printPostOrder(Node node)
{
if(node == null)
{
return;
}
printPostOrder(node._left);
printPostOrder(node._right);
System.out.print(node._key + " ");
}// end of method printPostOrder
/**
* private printInOrder method will print the values in the tree in InOrder
* @param None
* @return None
*/
private void printInOrder(Node node)
{
if(node == null)
{
return;
}
printInOrder(node._left);
System.out.print(node._key + " ");
printInOrder(node._right);
}// end of method printInOrder
/**
* private printPreOrder method will print the values in the tree in pre order
* @param None
* @return None
*/
private void printPreOrder(Node node)
{
if (node == null)
{
return;
}
printPreOrder(node._right);
printPreOrder(node._left);
System.out.print(node._key + " ");
}// end of method printPreOrder
}// end of class BinarySearchTree