package com.zhuyu_deng.test;
public class BinarySearchTree<T extends Comparable<? super T>>
{
// 结点
private static class BinaryNode<T>
{
T element;
BinaryNode<T> left;
BinaryNode<T> right;
BinaryNode(final T x, final BinaryNode<T> lt, final BinaryNode<T> rt)
{
element = x;
left = lt;
right = rt;
}
}
// 根
private BinaryNode<T> root;
public BinarySearchTree()
{
root = null;
}
//
public void makeEmpty()
{
root = null;
}
public boolean isEmpty()
{
return root == null;
}
public boolean contains(final T x)
{
return contains(x, root);
}
public void printTree()
{
if (isEmpty())
System.out.println("Empty tree");
else
printTree(root);
}
public void insert(T x)
{
root = insert(x, root);
}
public void remove(T x)
{
root = remove(x, root);
}
private boolean contains(final T x, final BinaryNode<T> t)
{
if (t == null)
return false;
final int rst = x.compareTo(t.element);
if (rst < 0)
return contains(x, t.left);
else if (rst > 0)
return contains(x, t.right);
else
;
return true;
}
// find min
private BinaryNode<T> findMin(final BinaryNode<T> t)
{
if (t == null)
return null;
else if (t.left == null)
return t;
return findMin(t.right);
}
// find max
@SuppressWarnings("unused")
private BinaryNode<T> findMax(BinaryNode<T> t)
{
if (t != null)
while (t.right != null)
t = t.right;
return t;
}
private BinaryNode<T> remove(final T x, BinaryNode<T> t)
{
if (t == null)
return t; // Item not found; do nothing
final int rst = x.compareTo(t.element);
if (rst < 0)
t.left = remove(x, t.left);
else if (rst > 0)
t.right = remove(x, t.right);
else if (t.left != null && t.right != null)
{
t.element = findMin(t.right).element;
t.right = remove(t.element, t.right);
}
else
{
t = (t.left != null) ? t.left : t.right;
}
return t;
}
private BinaryNode<T> insert(final T x, final BinaryNode<T> t)
{
if (t == null)
return new BinaryNode<T>(x, null, null);
final int rst = x.compareTo(t.element);
if (rst < 0)
t.left = insert(x, t.left);
else if (rst > 0)
t.right = insert(x, t.right);
else
;
return t;
}
private void printTree(final BinaryNode<T> t)
{
if (t != null)
{
printTree(t.left);
System.out.println(t.element);
printTree(t.right);
}
}
private int height(final BinaryNode<T> t)
{
if (t == null)
return -1;
else
return 1 + Math.max(height(t.left), height(t.right));
}
}