class BinarySearchTree {
private class BSTNode {
public Comparable data;
public BSTNode left;
public BSTNode right;
BSTNode(Comparable newdata) {
data = newdata;
}
}
private BSTNode root;
public void insert(Comparable elem)
{
root = insert(root, elem);
}
public boolean find(Comparable elem)
{
return find(root,elem);
}
void delete(Comparable elem)
{
root = delete(root, elem);
}
public void print()
{
print(root);
}
boolean find(BSTNode tree, Comparable elem)
{
if (tree == null)
return false;
if (elem.compareTo(tree.data) == 0)
return true;
if (elem.compareTo(tree.data) < 0)
return find(tree.left, elem);
else
return find(tree.right, elem);
}
Comparable minimum(BSTNode tree)
{
if (tree == null)
return null;
if (tree.left == null)
return tree.data;
else
return minimum(tree.left);
}
void print(BSTNode tree)
{
if (tree != null)
{
print(tree.left);
System.out.println(tree.data);
print(tree.right);
}
}
BSTNode insert(BSTNode tree, Comparable elem)
{
if (tree == null)
{
return new BSTNode(elem);
}
if (elem.compareTo(tree.data) < 0)
{
tree.left = insert(tree.left, elem);
return tree;
}
else
{
tree.right = insert(tree.right, elem);
return tree;
}
}
BSTNode delete(BSTNode tree, Comparable elem)
{
if (tree == null)
return null;
if (tree.data.compareTo(elem) == 0)
{
if (tree.left == null)
return tree.right;
else if (tree.right == null)
return tree.left;
else
{
if (tree.right.left == null)
{
tree.data = tree.right.data;
tree.right = tree.right.right;
return tree;
}
else
{
tree.data = removeSmallest(tree.right);
return tree;
}
}
}
else if (elem.compareTo(tree.data) < 0)
{
tree.left = delete(tree.left, elem);
return tree;
}
else
{
tree.right = delete(tree.right, elem);
return tree;
}
}
Comparable removeSmallest(BSTNode tree) {
if (tree.left.left == null) {
Comparable smallest = tree.left.data;
tree.left = tree.left.right;
return smallest;
}
else
{
return removeSmallest(tree.left);
}
}
}