28
28
public class SplayTree {
29
29
30
30
private static class Node {
31
- int key ;
31
+ final int key ;
32
32
Node left ;
33
33
Node right ;
34
34
@@ -41,14 +41,11 @@ private static class Node {
41
41
42
42
private Node root ;
43
43
44
- /**
45
- * Constructs an empty SplayTree.
46
- */
47
44
public SplayTree () {
48
45
root = null ;
49
46
}
50
47
51
- /**
48
+ /**
52
49
* Checks if the tree is empty.
53
50
*
54
51
* @return True if the tree is empty, otherwise false.
@@ -135,29 +132,26 @@ private Node splay(Node root, int key) {
135
132
root = rotateRight (root );
136
133
} // Zig-Zag case
137
134
else if (root .left .key < key ) {
138
- // Recursive call to splay on grandchild
139
135
root .left .right = splay (root .left .right , key );
140
136
// Perform zag operation on parent
141
- if (root .left .right != null ) root .left = rotateLeft (root .left );
137
+ if (root .left .right != null ) {
138
+ root .left = rotateLeft (root .left );
139
+ }
142
140
}
143
-
144
141
return (root .left == null ) ? root : rotateRight (root );
145
142
} else {
146
143
if (root .right == null ) return root ;
147
144
// Zag-Zag case
148
145
if (root .right .key > key ) {
149
- // Recursive call to splay on grandchild
150
146
root .right .left = splay (root .right .left , key );
151
147
// Perform zig operation on parent
152
148
if (root .right .left != null ) root .right = rotateRight (root .right );
153
149
} // Zag-Zig case
154
150
else if (root .right .key < key ) {
155
- // Recursive call to splay on grandchild
156
151
root .right .right = splay (root .right .right , key );
157
152
// Perform zag operation on parent
158
153
root = rotateLeft (root );
159
154
}
160
-
161
155
return (root .right == null ) ? root : rotateLeft (root );
162
156
}
163
157
}
@@ -228,8 +222,8 @@ public void delete(int key) {
228
222
if (root .left == null ) {
229
223
root = root .right ;
230
224
} else {
231
- Node temp = root ;
232
225
// Splay to bring the largest key in left subtree to root
226
+ Node temp = root ;
233
227
root = splay (root .left , key );
234
228
root .right = temp .right ;
235
229
}
@@ -238,71 +232,73 @@ public void delete(int key) {
238
232
/**
239
233
* Perform a traversal of the SplayTree.
240
234
*
241
- * @param traverseOrder The order of traversal (IN_ORDER, PRE_ORDER, or POST_ORDER) .
235
+ * @param traversal The type of traversal method .
242
236
* @return A list containing the keys in the specified traversal order.
243
237
*/
244
- public List <Integer > traverse (TraverseOrder traverseOrder ) {
238
+ public List <Integer > traverse (TreeTraversal traversal ) {
245
239
List <Integer > result = new LinkedList <>();
246
- switch (traverseOrder ) {
247
- case IN_ORDER :
248
- inOrderRec (root , result );
249
- break ;
250
- case PRE_ORDER :
251
- preOrderRec (root , result );
252
- break ;
253
- case POST_ORDER :
254
- postOrderRec (root , result );
255
- break ;
256
- default :
257
- throw new IllegalArgumentException ("Invalid traversal order: " + traverseOrder );
258
- }
240
+ traversal .traverse (root , result );
259
241
return result ;
260
242
}
261
243
262
- /**
263
- * Recursive function for in-order traversal.
264
- *
265
- * @param root The root of the subtree to traverse.
266
- * @param result The list to store the traversal result.
267
- */
268
- private void inOrderRec (Node root , List <Integer > result ) {
269
- if (root != null ) {
270
- inOrderRec (root .left , result );
271
- result .add (root .key );
272
- inOrderRec (root .right , result );
244
+ public interface TreeTraversal {
245
+ /**
246
+ * Recursive function for a specific order traversal.
247
+ *
248
+ * @param root The root of the subtree to traverse.
249
+ * @param result The list to store the traversal result.
250
+ */
251
+ void traverse (Node root , List <Integer > result );
252
+ }
253
+
254
+ private static final class InOrderTraversal implements TreeTraversal {
255
+ private InOrderTraversal () {
256
+ }
257
+
258
+ public void traverse (Node root , List <Integer > result ) {
259
+ if (root != null ) {
260
+ traverse (root .left , result );
261
+ result .add (root .key );
262
+ traverse (root .right , result );
263
+ }
273
264
}
274
265
}
275
266
276
- /**
277
- * Recursive function for pre-order traversal.
278
- *
279
- * @param root The root of the subtree to traverse.
280
- * @param result The list to store the traversal result.
281
- */
282
- private void preOrderRec (Node root , List <Integer > result ) {
283
- if (root != null ) {
284
- result .add (root .key );
285
- preOrderRec (root .left , result );
286
- preOrderRec (root .right , result );
267
+ private static final class PreOrderTraversal implements TreeTraversal {
268
+ private PreOrderTraversal () {
269
+ }
270
+
271
+ public void traverse (Node root , List <Integer > result ) {
272
+ if (root != null ) {
273
+ result .add (root .key );
274
+ traverse (root .left , result );
275
+ traverse (root .right , result );
276
+ }
287
277
}
288
278
}
289
279
290
- /**
291
- * Recursive function for post-order traversal.
292
- *
293
- * @param root The root of the subtree to traverse.
294
- * @param result The list to store the traversal result.
295
- */
296
- private void postOrderRec (Node root , List <Integer > result ) {
297
- if (root != null ) {
298
- postOrderRec (root .left , result );
299
- postOrderRec (root .right , result );
300
- result .add (root .key );
280
+ private static final class PostOrderTraversal implements TreeTraversal {
281
+ private PostOrderTraversal () {
282
+ }
283
+
284
+ public void traverse (Node root , List <Integer > result ) {
285
+ if (root != null ) {
286
+ traverse (root .left , result );
287
+ traverse (root .right , result );
288
+ result .add (root .key );
289
+ }
301
290
}
302
291
}
303
292
304
- /**
305
- * Enum to specify the order of traversal.
306
- */
307
- public enum TraverseOrder { IN_ORDER , PRE_ORDER , POST_ORDER , INVALID }
293
+ public static TreeTraversal getInOrderTraversal () {
294
+ return new InOrderTraversal ();
295
+ }
296
+
297
+ public static TreeTraversal getPreOrderTraversal () {
298
+ return new PreOrderTraversal ();
299
+ }
300
+
301
+ public static TreeTraversal getPostOrderTraversal () {
302
+ return new PostOrderTraversal ();
303
+ }
308
304
}
0 commit comments