10
10
*
11
11
* @author Deepak
12
12
*/
13
- public class BinarySearchTree {
13
+ public class BinarySearchTree < E extends Comparable < E >> {
14
14
15
15
/* We will maintain root and size of the tree.
16
16
* Size here means number of nodes in the tree */
17
- private Node root ;
17
+ private Node < E > root ;
18
18
19
19
/**
20
20
* Add Node to the tree
21
21
*/
22
- public void addNode (int value ) {
22
+ public void addNode (E value ) {
23
23
if (root == null ) {
24
- root = new Node (value );
24
+ root = new Node < E > (value );
25
25
} else {
26
26
addNode (root , value );
27
27
}
28
28
}
29
29
30
- private Node addNode (Node root , int value ) {
30
+ private Node < E > addNode (Node < E > root , E value ) {
31
31
if (root == null ) {
32
32
return null ;
33
33
}
34
- if (value <= root . value ) { /* We will insert left */
34
+ if (( root . value ). compareTo ( value ) <= 0 ) { /* We will insert left */
35
35
if (root .left != null ) {
36
36
addNode (root .left , value );
37
37
} else {
38
- root .left = new Node (value );
38
+ root .left = new Node < E > (value );
39
39
}
40
40
} else { /* We will insert right */
41
41
if (root .right != null ) {
42
42
addNode (root .right , value );
43
43
} else {
44
- root .right = new Node (value );
44
+ root .right = new Node < E > (value );
45
45
}
46
46
}
47
47
return root ;
@@ -51,7 +51,7 @@ public int size() {
51
51
return size (root );
52
52
}
53
53
54
- private int size (Node root ) {
54
+ private int size (Node < E > root ) {
55
55
if (root == null ) {
56
56
return 0 ;
57
57
}
@@ -62,22 +62,22 @@ public boolean isEmpty() {
62
62
return size () == 0 ;
63
63
}
64
64
65
- public Node getRoot () {
65
+ public Node < E > getRoot () {
66
66
if (isEmpty ()) {
67
67
return null ;
68
68
}
69
69
return root ;
70
70
}
71
71
72
- public boolean isRoot (Node node ) {
72
+ public boolean isRoot (Node < E > node ) {
73
73
return node == root ;
74
74
}
75
75
76
- public Node findParent (Node node ) {
76
+ public Node < E > findParent (Node < E > node ) {
77
77
return findParent (node .value , root , null );
78
78
}
79
79
80
- private Node findParent (int value , Node root , Node parent ) {
80
+ private Node < E > findParent (E value , Node < E > root , Node < E > parent ) {
81
81
if (root == null ) {
82
82
return null ;
83
83
}
@@ -90,37 +90,37 @@ private Node findParent(int value, Node root, Node parent) {
90
90
return parent ;
91
91
}
92
92
93
- public boolean hasParent (Node node ) {
93
+ public boolean hasParent (Node < E > node ) {
94
94
return findParent (node ) != null ;
95
95
}
96
96
97
- public boolean hasLeftNode (Node node ) {
97
+ public boolean hasLeftNode (Node < E > node ) {
98
98
return node .left != null ;
99
99
}
100
100
101
- public boolean hasRightNode (Node node ) {
101
+ public boolean hasRightNode (Node < E > node ) {
102
102
return node .right != null ;
103
103
}
104
104
105
- public Node findLeft (Node node ) {
105
+ public Node < E > findLeft (Node < E > node ) {
106
106
if (hasLeftNode (node )) {
107
107
return node .left ;
108
108
}
109
109
return null ;
110
110
}
111
111
112
- public Node findRight (Node node ) {
112
+ public Node < E > findRight (Node < E > node ) {
113
113
if (hasRightNode (node )) {
114
114
return node .right ;
115
115
}
116
116
return null ;
117
117
}
118
118
119
- public boolean isLeafNode (Node node ) {
119
+ public boolean isLeafNode (Node < E > node ) {
120
120
return !hasLeftNode (node ) && !hasRightNode (node );
121
121
}
122
122
123
- public static int getDepth (Node node ) {
123
+ public int getDepth (Node < E > node ) {
124
124
if (node == null ) {
125
125
return 0 ;
126
126
}
@@ -129,14 +129,14 @@ public static int getDepth(Node node) {
129
129
return left > right ? left + 1 : right + 1 ;
130
130
}
131
131
132
- public boolean contains (int value ) {
132
+ public boolean contains (E value ) {
133
133
return search (value ) != null ;
134
134
}
135
135
136
- public Node search (int value ) {
137
- Node node = root ;
136
+ public Node < E > search (E value ) {
137
+ Node < E > node = root ;
138
138
while (node != null && node .value != value ) {
139
- if (value <= node . value ) {
139
+ if (value . compareTo ( node . value ) <= 0 ) {
140
140
node = node .left ;
141
141
} else {
142
142
node = node .right ;
@@ -145,23 +145,23 @@ public Node search(int value) {
145
145
return node ;
146
146
}
147
147
148
- public Node delete (int value ) {
148
+ public Node < E > delete (E value ) {
149
149
return delete (root , value );
150
150
}
151
151
152
152
/* There are 3 cases here,
153
153
* 1. Node to be removed has no child
154
154
* 2. Node to be removed has one child
155
155
* 3. Node to be removed has two child */
156
- private Node delete (Node root , int value ) {
156
+ private Node < E > delete (Node < E > root , E value ) {
157
157
/* Base case, when tree is empty */
158
158
if (root == null ) {
159
159
return root ;
160
160
}
161
161
/* Now, go down the tree */
162
- if (value < root .value ) {
162
+ if (value . compareTo ( root .value ) < 0 ) {
163
163
root .left = delete (root .left , value );
164
- } else if (value > root .value ) {
164
+ } else if (value . compareTo ( root .value ) > 0 ) {
165
165
root .right = delete (root .right , value );
166
166
} else { /* If key is same as the root key, this is the node to be deleted */
167
167
/* Node with only one child or no child */
@@ -170,7 +170,7 @@ private Node delete(Node root, int value) {
170
170
} else if (root .right == null ) {
171
171
return root .left ;
172
172
}
173
- int minv = root .value ;
173
+ E minv = root .value ;
174
174
while (root .left != null )
175
175
{
176
176
minv = root .left .value ;
@@ -182,16 +182,16 @@ private Node delete(Node root, int value) {
182
182
return root ;
183
183
}
184
184
185
- public int getMinimum () {
186
- Node node = root ;
185
+ public E getMinimum () {
186
+ Node < E > node = root ;
187
187
while (node .left != null ) {
188
188
node = node .left ;
189
189
}
190
190
return node .value ;
191
191
}
192
192
193
- public int getMaximum () {
194
- Node node = root ;
193
+ public E getMaximum () {
194
+ Node < E > node = root ;
195
195
while (node .right != null ) {
196
196
node = node .right ;
197
197
}
@@ -200,7 +200,7 @@ public int getMaximum() {
200
200
201
201
/* All of these are DFS */
202
202
/* Left -> Root -> Right */
203
- public void traverseInOrder (Node node ) {
203
+ public void traverseInOrder (Node < E > node ) {
204
204
if (node == null ) {
205
205
return ;
206
206
}
@@ -210,7 +210,7 @@ public void traverseInOrder(Node node) {
210
210
}
211
211
212
212
/* Root -> Left -> Right */
213
- public void traversePreOrder (Node node ) {
213
+ public void traversePreOrder (Node < E > node ) {
214
214
if (node == null ) {
215
215
return ;
216
216
}
@@ -220,7 +220,7 @@ public void traversePreOrder(Node node) {
220
220
}
221
221
222
222
/* Left -> Root -> Right */
223
- public void traversePostOrder (Node node ) {
223
+ public void traversePostOrder (Node < E > node ) {
224
224
if (node == null ) {
225
225
return ;
226
226
}
@@ -231,17 +231,17 @@ public void traversePostOrder(Node node) {
231
231
232
232
/* This is BFS */
233
233
/* Level by Level */
234
- public void traverseLevelOrder (Node root ) {
235
- Queue <Node > firstQ = new LinkedList <>();
234
+ public void traverseLevelOrder (Node < E > root ) {
235
+ Queue <Node < E > > firstQ = new LinkedList <>();
236
236
firstQ .add (root );
237
237
238
- Queue <Queue <Node >> mainQ = new LinkedList <>();
238
+ Queue <Queue <Node < E > >> mainQ = new LinkedList <>();
239
239
mainQ .add (firstQ );
240
240
241
241
while (!mainQ .isEmpty ()) {
242
- Queue <Node > levelQ = mainQ .remove ();
243
- Queue <Node > nextLevelQ = new LinkedList <>();
244
- for (Node x : levelQ ) {
242
+ Queue <Node < E > > levelQ = mainQ .remove ();
243
+ Queue <Node < E > > nextLevelQ = new LinkedList <>();
244
+ for (Node < E > x : levelQ ) {
245
245
System .out .print (x .value + " " );
246
246
if (x .left != null ) nextLevelQ .add (x .left );
247
247
if (x .right != null ) nextLevelQ .add (x .right );
@@ -256,13 +256,13 @@ public void traverseLevelOrder(Node root) {
256
256
*
257
257
* @author Deepak
258
258
*/
259
- public class Node {
259
+ public class Node < T > {
260
260
261
- private Node left ;
262
- private Node right ;
263
- private int value ;
261
+ private Node < T > left ;
262
+ private Node < T > right ;
263
+ private T value ;
264
264
265
- public Node (int value ) {
265
+ public Node (T value ) {
266
266
this .value = value ;
267
267
}
268
268
0 commit comments