Skip to content

Commit 4f08a75

Browse files
committed
Moving trees to generics
1 parent 47e3b3d commit 4f08a75

File tree

4 files changed

+133
-115
lines changed

4 files changed

+133
-115
lines changed

src/com/deepak/data/structure/Tree/BinarySearchTree.java

+47-47
Original file line numberDiff line numberDiff line change
@@ -10,38 +10,38 @@
1010
*
1111
* @author Deepak
1212
*/
13-
public class BinarySearchTree {
13+
public class BinarySearchTree<E extends Comparable<E>> {
1414

1515
/* We will maintain root and size of the tree.
1616
* Size here means number of nodes in the tree */
17-
private Node root;
17+
private Node<E> root;
1818

1919
/**
2020
* Add Node to the tree
2121
*/
22-
public void addNode(int value) {
22+
public void addNode(E value) {
2323
if (root == null) {
24-
root = new Node(value);
24+
root = new Node<E>(value);
2525
} else {
2626
addNode(root, value);
2727
}
2828
}
2929

30-
private Node addNode(Node root, int value) {
30+
private Node<E> addNode(Node<E> root, E value) {
3131
if (root == null) {
3232
return null;
3333
}
34-
if (value <= root.value) { /* We will insert left */
34+
if ((root.value).compareTo(value) <= 0) { /* We will insert left */
3535
if (root.left != null) {
3636
addNode(root.left, value);
3737
} else {
38-
root.left = new Node(value);
38+
root.left = new Node<E>(value);
3939
}
4040
} else { /* We will insert right */
4141
if (root.right != null) {
4242
addNode(root.right, value);
4343
} else {
44-
root.right = new Node(value);
44+
root.right = new Node<E>(value);
4545
}
4646
}
4747
return root;
@@ -51,7 +51,7 @@ public int size() {
5151
return size(root);
5252
}
5353

54-
private int size(Node root) {
54+
private int size(Node<E> root) {
5555
if (root == null) {
5656
return 0;
5757
}
@@ -62,22 +62,22 @@ public boolean isEmpty() {
6262
return size() == 0;
6363
}
6464

65-
public Node getRoot() {
65+
public Node<E> getRoot() {
6666
if (isEmpty()) {
6767
return null;
6868
}
6969
return root;
7070
}
7171

72-
public boolean isRoot(Node node) {
72+
public boolean isRoot(Node<E> node) {
7373
return node == root;
7474
}
7575

76-
public Node findParent(Node node) {
76+
public Node<E> findParent(Node<E> node) {
7777
return findParent(node.value, root, null);
7878
}
7979

80-
private Node findParent(int value, Node root, Node parent) {
80+
private Node<E> findParent(E value, Node<E> root, Node<E> parent) {
8181
if (root == null) {
8282
return null;
8383
}
@@ -90,37 +90,37 @@ private Node findParent(int value, Node root, Node parent) {
9090
return parent;
9191
}
9292

93-
public boolean hasParent(Node node) {
93+
public boolean hasParent(Node<E> node) {
9494
return findParent(node) != null;
9595
}
9696

97-
public boolean hasLeftNode(Node node) {
97+
public boolean hasLeftNode(Node<E> node) {
9898
return node.left != null;
9999
}
100100

101-
public boolean hasRightNode(Node node) {
101+
public boolean hasRightNode(Node<E> node) {
102102
return node.right != null;
103103
}
104104

105-
public Node findLeft(Node node) {
105+
public Node<E> findLeft(Node<E> node) {
106106
if (hasLeftNode(node)) {
107107
return node.left;
108108
}
109109
return null;
110110
}
111111

112-
public Node findRight(Node node) {
112+
public Node<E> findRight(Node<E> node) {
113113
if (hasRightNode(node)) {
114114
return node.right;
115115
}
116116
return null;
117117
}
118118

119-
public boolean isLeafNode(Node node) {
119+
public boolean isLeafNode(Node<E> node) {
120120
return !hasLeftNode(node) && !hasRightNode(node);
121121
}
122122

123-
public static int getDepth(Node node) {
123+
public int getDepth(Node<E> node) {
124124
if (node == null) {
125125
return 0;
126126
}
@@ -129,14 +129,14 @@ public static int getDepth(Node node) {
129129
return left > right ? left + 1 : right + 1;
130130
}
131131

132-
public boolean contains(int value) {
132+
public boolean contains(E value) {
133133
return search(value) != null;
134134
}
135135

136-
public Node search(int value) {
137-
Node node = root;
136+
public Node<E> search(E value) {
137+
Node<E> node = root;
138138
while (node != null && node.value != value) {
139-
if (value <= node.value) {
139+
if (value.compareTo(node.value) <= 0) {
140140
node = node.left;
141141
} else {
142142
node = node.right;
@@ -145,23 +145,23 @@ public Node search(int value) {
145145
return node;
146146
}
147147

148-
public Node delete(int value) {
148+
public Node<E> delete(E value) {
149149
return delete(root, value);
150150
}
151151

152152
/* There are 3 cases here,
153153
* 1. Node to be removed has no child
154154
* 2. Node to be removed has one child
155155
* 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) {
157157
/* Base case, when tree is empty */
158158
if (root == null) {
159159
return root;
160160
}
161161
/* Now, go down the tree */
162-
if (value < root.value) {
162+
if (value.compareTo(root.value) < 0) {
163163
root.left = delete(root.left, value);
164-
} else if (value > root.value) {
164+
} else if (value.compareTo(root.value) > 0) {
165165
root.right = delete(root.right, value);
166166
} else { /* If key is same as the root key, this is the node to be deleted */
167167
/* Node with only one child or no child */
@@ -170,7 +170,7 @@ private Node delete(Node root, int value) {
170170
} else if (root.right == null) {
171171
return root.left;
172172
}
173-
int minv = root.value;
173+
E minv = root.value;
174174
while (root.left != null)
175175
{
176176
minv = root.left.value;
@@ -182,16 +182,16 @@ private Node delete(Node root, int value) {
182182
return root;
183183
}
184184

185-
public int getMinimum() {
186-
Node node = root;
185+
public E getMinimum() {
186+
Node<E> node = root;
187187
while (node.left != null) {
188188
node = node.left;
189189
}
190190
return node.value;
191191
}
192192

193-
public int getMaximum() {
194-
Node node = root;
193+
public E getMaximum() {
194+
Node<E> node = root;
195195
while (node.right != null) {
196196
node = node.right;
197197
}
@@ -200,7 +200,7 @@ public int getMaximum() {
200200

201201
/* All of these are DFS */
202202
/* Left -> Root -> Right */
203-
public void traverseInOrder(Node node) {
203+
public void traverseInOrder(Node<E> node) {
204204
if (node == null) {
205205
return;
206206
}
@@ -210,7 +210,7 @@ public void traverseInOrder(Node node) {
210210
}
211211

212212
/* Root -> Left -> Right */
213-
public void traversePreOrder(Node node) {
213+
public void traversePreOrder(Node<E> node) {
214214
if (node == null) {
215215
return;
216216
}
@@ -220,7 +220,7 @@ public void traversePreOrder(Node node) {
220220
}
221221

222222
/* Left -> Root -> Right */
223-
public void traversePostOrder(Node node) {
223+
public void traversePostOrder(Node<E> node) {
224224
if (node == null) {
225225
return;
226226
}
@@ -231,17 +231,17 @@ public void traversePostOrder(Node node) {
231231

232232
/* This is BFS */
233233
/* 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<>();
236236
firstQ.add(root);
237237

238-
Queue<Queue<Node>> mainQ = new LinkedList<>();
238+
Queue<Queue<Node<E>>> mainQ = new LinkedList<>();
239239
mainQ.add(firstQ);
240240

241241
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) {
245245
System.out.print(x.value + " ");
246246
if (x.left != null) nextLevelQ.add(x.left);
247247
if (x.right != null) nextLevelQ.add(x.right);
@@ -256,13 +256,13 @@ public void traverseLevelOrder(Node root) {
256256
*
257257
* @author Deepak
258258
*/
259-
public class Node {
259+
public class Node<T> {
260260

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;
264264

265-
public Node(int value) {
265+
public Node(T value) {
266266
this.value = value;
267267
}
268268

0 commit comments

Comments
 (0)