1 public class BST<E extends Comparable<E>>
2 extends AbstractTree<E> {
3 protected TreeNode<E> root;
4 protected int size = 0;
5
6
7 public BST() {
8 }
9
10
11 public BST(E[] objects) {
12 for (int i = 0; i < objects.length; i++)
13 insert(objects[i]);
14 }
15
16 @Override
17 public boolean search(E e) {
18 TreeNode<E> current = root;
19
20 while (current != null) {
21 if (e.compareTo(current.element) < 0) {
22 current = current.left;
23 }
24 else if (e.compareTo(current.element) > 0) {
25 current = current.right;
26 }
27 else
28 return true;
29 }
30
31 return false;
32 }
33
34 @Override
36 public boolean insert(E e) {
37 if (root == null)
38 root = createNewNode(e);
39 else {
40
41 TreeNode<E> parent = null;
42 TreeNode<E> current = root;
43 while (current != null)
44 if (e.compareTo(current.element) < 0) {
45 parent = current;
46 current = current.left;
47 }
48 else if (e.compareTo(current.element) > 0) {
49 parent = current;
50 current = current.right;
51 }
52 else
53 return false;
54
55
56 if (e.compareTo(parent.element) < 0)
57 parent.left = createNewNode(e);
58 else
59 parent.right = createNewNode(e);
60 }
61
62 size++;
63 return true;
64 }
65
66 protected TreeNode<E> createNewNode(E e) {
67 return new TreeNode<E>(e);
68 }
69
70 @Override
71 public void inorder() {
72 inorder(root);
73 }
74
75
76 protected void inorder(TreeNode<E> root) {
77 if (root == null) return;
78 inorder(root.left);
79 System.out.print(root.element + " ");
80 inorder(root.right);
81 }
82
83 @Override
84 public void postorder() {
85 postorder(root);
86 }
87
88
89 protected void postorder(TreeNode<E> root) {
90 if (root == null) return;
91 postorder(root.left);
92 postorder(root.right);
93 System.out.print(root.element + " ");
94 }
95
96 @Override
97 public void preorder() {
98 preorder(root);
99 }
100
101
102 protected void preorder(TreeNode<E> root) {
103 if (root == null) return;
104 System.out.print(root.element + " ");
105 preorder(root.left);
106 preorder(root.right);
107 }
108
109
111 public static class TreeNode<E extends Comparable<E>> {
112 protected E element;
113 protected TreeNode<E> left;
114 protected TreeNode<E> right;
115
116 public TreeNode(E e) {
117 element = e;
118 }
119 }
120
121 @Override
122 public int getSize() {
123 return size;
124 }
125
126
127 public TreeNode<E> getRoot() {
128 return root;
129 }
130
131
132 public java.util.ArrayList<TreeNode<E>> path(E e) {
133 java.util.ArrayList<TreeNode<E>> list =
134 new java.util.ArrayList<TreeNode<E>>();
135 TreeNode<E> current = root;
136
137 while (current != null) {
138 list.add(current);
139 if (e.compareTo(current.element) < 0) {
140 current = current.left;
141 }
142 else if (e.compareTo(current.element) > 0) {
143 current = current.right;
144 }
145 else
146 break;
147 }
148
149 return list;
150 }
151
152 @Override
155 public boolean delete(E e) {
156
157 TreeNode<E> parent = null;
158 TreeNode<E> current = root;
159 while (current != null) {
160 if (e.compareTo(current.element) < 0) {
161 parent = current;
162 current = current.left;
163 }
164 else if (e.compareTo(current.element) > 0) {
165 parent = current;
166 current = current.right;
167 }
168 else
169 break;
170 }
171
172 if (current == null)
173 return false;
174
175
176 if (current.left == null) {
177
178 if (parent == null) {
179 root = current.right;
180 }
181 else {
182 if (e.compareTo(parent.element) < 0)
183 parent.left = current.right;
184 else
185 parent.right = current.right;
186 }
187 }
188 else {
189
190
191
192 TreeNode<E> parentOfRightMost = current;
193 TreeNode<E> rightMost = current.left;
194
195 while (rightMost.right != null) {
196 parentOfRightMost = rightMost;
197 rightMost = rightMost.right;
198 }
199
200
201 current.element = rightMost.element;
202
203
204 if (parentOfRightMost.right == rightMost)
205 parentOfRightMost.right = rightMost.left;
206 else
207
208 parentOfRightMost.left = rightMost.left;
209 }
210
211 size--;
212 return true;
213 }
214
215 @Override
216 public java.util.Iterator<E> iterator() {
217 return new InorderIterator();
218 }
219
220
221 private class InorderIterator implements java.util.Iterator<E> {
222
223 private java.util.ArrayList<E> list =
224 new java.util.ArrayList<E>();
225 private int current = 0;
226
227 public InorderIterator() {
228 inorder();
229 }
230
231
232 private void inorder() {
233 inorder(root);
234 }
235
236
237 private void inorder(TreeNode<E> root) {
238 if (root == null)return;
239 inorder(root.left);
240 list.add(root.element);
241 inorder(root.right);
242 }
243
244 @Override
245 public boolean hasNext() {
246 if (current < list.size())
247 return true;
248
249 return false;
250 }
251
252 @Override
253 public E next() {
254 return list.get(current++);
255 }
256
257 @Override
258 public void remove() {
259 delete(list.get(current));
260 list.clear();
261 inorder();
262 }
263 }
264
265
266 public void clear() {
267 root = null;
268 size = 0;
269 }
270 }