BST.java |
BST.java
package ninenine;
//定义二分搜索树的类
public class BST<E extends Comparable<E>> {//泛型要求是可以比较的
private class Node {
public E e;
public Node left, right;
public Node(E e) {
this.e = e;
left = null;
right = null;
}
}
private Node root;
private int size;
//二叉树构造函数
public BST(){
root = null;
size = 0;
}
//getsize
public int size(){
return size;
}
//判断二叉树是否为空
public boolean isEmpty(){
return size == 0;
}
// 向二分搜索树中添加新的元素e
public void add(E e){
if(root == null){
root = new Node(e);
size ++;
}
else
add(root, e);//调用函数add(Node node, E e)
}
// 向以node为根的二分搜索树中插入元素e,递归算法
/*private void add(Node node, E e){
if(e.equals(node.e))//如果元素e等于根节点的值
return;//提前退出函数
else if(e.compareTo(node.e) < 0 && node.left == null){
//如果元素e小于根节点的值且根节点的左子节点为空
node.left = new Node(e);//将e添加到左节点
size ++;
return;
}
else if(e.compareTo(node.e) > 0 && node.right == null){
//如果元素e大于根节点的值且根节点的右子节点为空
node.right = new Node(e);//将e添加到右节点
size ++;
return;
}
if(e.compareTo(node.e) < 0)
//如果e小于根节点且根节点的左子节点不为空
add(node.left, e);
else //e.compareTo(node.e) > 0
//如果e大于根节点且根节点的右子节点不为空
add(node.right, e);
}*/
//向以node为根的二分搜索树中插入元素e,递归算法
//返回插入新节点后二分搜索树的根
private Node add(Node node,E e) {
if(node==null) {
size++;
return new Node(e);
}
if(e.compareTo(node.e)<0) {
node.left=add(node.left,e);//因为空子树本身也是一颗二叉树,所以可以这样写
}
else if(e.compareTo(node.e)>0) {
node.right=add(node.right,e);
}
return node;
}
// 看二分搜索树中是否包含元素e
public boolean contains(E e){
return contains(root, e);
}
// 看以node为根的二分搜索树中是否包含元素e, 递归算法
private boolean contains(Node node, E e){
if(node == null)
return false;
if(e.compareTo(node.e) == 0)
return true;
else if(e.compareTo(node.e) < 0)
return contains(node.left, e);
else {//必须写成else不然会报错
return contains(node.right, e);
}
}
}