/
BinarySearchTree.java
124 lines (112 loc) · 2.84 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
package cmsc256;
public class BinarySearchTree <E extends Comparable<? super E>>{
private int size = 0;
private BinaryNode root = null;
class BinaryNode{
protected E value;
protected BinaryNode right;
protected BinaryNode left;
public BinaryNode(E valueIn) {
value = valueIn;
}
}
public BinarySearchTree() {
this.root = null;
}
private boolean addToParent(BinaryNode parentNode, BinaryNode addNode) {
int compare = parentNode.value.compareTo(addNode.value);
boolean wasAdded = false;
if (compare > 0) {
// if parent has no left node, add new node as left
if (parentNode.left == null) {
parentNode.left = addNode;
wasAdded = true;
}else{
// otherwise, add to parentNode's left (recursive)
wasAdded = addToParent(parentNode.left, addNode);
}
}else if (compare < 0) {
// if parent has no right node, add new node as right
if (parentNode.right == null) {
parentNode.right = addNode;
wasAdded = true;
}else{
// otherwise, add to parentNode's right (recursive)
wasAdded = addToParent(parentNode.right, addNode);
}
}
return wasAdded;
}
public boolean add(E value) {
BinaryNode node = new BinaryNode(value);
boolean wasAdded = true;
if (root == null) {
root = node;
}else {
wasAdded = addToParent(root, node);
}
if (wasAdded) {
size++;
}
return wasAdded;
}
public boolean remove(E value) {
if (root == null) {
return false; }
if (root.value.compareTo(value) == 0) {
if (root.left == null) {
root = root.right;
} else if (root.right == null) {
root = root.left; }
else {
BinaryNode formerRight = root.right;
root = root.left;
addToParent(root, formerRight); }
size--;
return true; }
return removeSubNode(root, value);
}
private boolean removeSubNode(BinaryNode parent, E removeValue) {
int compareParent = parent.value.compareTo(removeValue);
BinaryNode subTree = null;
if (compareParent > 0) {
subTree = parent.left;
}else {
subTree = parent.right;
}
if (subTree == null) {
return false;
}
if (subTree.value.compareTo(removeValue) == 0) {
BinaryNode replacement;
if (subTree.left == null) {
replacement = subTree.right;
}else if (subTree.right == null){
replacement = subTree.left;
}else {
BinaryNode formerRight = subTree.right;
replacement = subTree.left;
addToParent(replacement, formerRight);
}
if (compareParent > 0){
parent.left = replacement;
}
else {
parent.right = replacement;
}
size--;
return true;
}
return removeSubNode(subTree, removeValue);
}
public int size(){
return size;
}
public BinaryNode getRoot() {
return root;
}
public void clear(){
root = null;
size = 0;
}
}