Binary Search Tree
import java.util.LinkedList;
import java.util.Queue;
class BinarySearchTree<T extends Comparable<T>> {
TreeNode<T> root;
public void add(T value) {
if (root == null) {
root = new TreeNode<>(value);
} else {
addNode(value, root);
}
}
public void addNode(T value, TreeNode<T> node) {
if (isValueHigherThanNodeValue(value, node)) {
// higher values go on left
addToRight(value, node);
} else {
// lower values go on left
addToLeft(value, node);
}
}
private void addToLeft(T value, TreeNode<T> node) {
if (node.left == null) {
node.left = new TreeNode<>(value);
return;
}
addNode(value, node.left);
}
private void addToRight(T value, TreeNode<T> node) {
if (node.right == null) {
node.right = new TreeNode<>(value);
return;
}
addNode(value, node.right);
}
private boolean isValueHigherThanNodeValue(T value, TreeNode<T> current) {
return value.compareTo(current.value) > 0;
}
public String toString() {
return asString(root, 0);
}
private String asString(TreeNode<T> node, int level) {
if (node == null) return null;
String result = spaces(level) + node.value.toString() + " \n";
level++;
if (node.left != null) {
result += asString(node.left, level);
}
if (node.right != null) {
result += asString(node.right, level);
}
return result;
}
private String spaces(int level) {
String spaces = "";
for (int i = 0; i < level; i++) {
spaces += "-";
}
return spaces;
}
// read to queue in 'breath first' order
public Queue<TreeNode<T>> readToQueue(TreeNode<T> node) {
Queue<TreeNode<T>> queue = new LinkedList<>();
Queue<TreeNode<T>> temp = new LinkedList<>();
temp.add(node);
while (temp.size() > 0) {
TreeNode<T> n = temp.poll();
queue.add(n);
if (n.left != null) {
temp.add(n.left);
}
if (n.right != null) {
temp.add(n.right);
}
}
return queue;
}
// breath first or a.k.a. level order traversal
// -> A
// -> B -> C
// -> D -> E -> F -> G
public String breathFirst(TreeNode<T> node) {
Queue<TreeNode<T>> queue = new LinkedList<>();
queue.add(node);
String value = "";
while (queue.size() > 0) {
TreeNode<T> n = queue.poll();
value += n.value.toString() + " ";
if (n.left != null) {
queue.add(n.left);
}
if (n.right != null) {
queue.add(n.right);
}
}
return value;
}
enum Order {
Pre, In, Post
}
// pre order traversal - root, left, right
// in order traversal - left, root, right
// post order traversal - left, right root
public String depthFirst(TreeNode<T> node, Order order) {
if (node == null) return null;
String value = "";
if (order.equals(Order.Pre)) {
value += node.value.toString() + " ";
}
if (node.left != null) {
value += depthFirst(node.left, order);
}
if (order.equals(Order.In)) {
value += node.value.toString() + " ";
}
if (node.right != null) {
value += depthFirst(node.right, order);
}
if (order.equals(Order.Post)) {
value += node.value.toString() + " ";
}
return value;
}
}Last updated