二分搜索树是有顺序的树,某节点T的左子树都小于T节点,T的右子树均大于T节点的值。 实现的关键代码为add操作,用递归很容易实现。
package tree;
/*
* @Param
* */
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;
}
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
/*
* 第一种add代码相对复杂,逻辑更清晰
* */
/*
public void add(E e){
if (root==null){
root=new Node(e);size++;
}else add(root,e);
}
private void add(Node node, E e) {
//终止条件: -- 多个终止条件---终止条件直接返回
if (node.e.equals(e)) return;
else if (node.e.compareTo(e)<0 && node.right==null){
node.right=new Node(e);size++;
return;
}
else if (node.e.compareTo(e)>0 && node.left==null){
node.left=new Node(e);size++;
return;
}
//规模减小
if (node.e.compareTo(e)<0) add(node.right,e);
else add(node.left,e);
}*/
public void add(E e) {
root = add(root, e);
}
private Node add(Node node, E e) {
//终止条件
if (node == null) {
size++;
return new Node(e);
}
//规模减小,这里逻辑容易出错。
if (e.compareTo(node.e) > 0)
node.right = add(node.right, e);
else if (e.compareTo(node.e) < 0)
node.left = add(node.left, e);
return node;
}
}
contains方法
public boolean contains(E e){
return contains(root,e);
}
private boolean contains(Node node, E e) {
//2.终止条件
if (node.e.compareTo(e)==0)
return true;
else if (node==null)
return false;
//1.规模减少1
if (e.compareTo(node.e)>0)
return contains(node.right,e);
else //if (e.compareTo(node.e)<0)
return contains(node.left,e);
}
前序遍历(中序遍历,和后续遍历原理相同)
//前序遍历操作,递归方法
public void preOder(){
preOder(root);
}
public void preOder(Node node){
//2.终止条件
if (node==null)
return;
/*
* 1.规模缩小。
* 访问该节点---》访问该节点的左子树、和右子树。
* */
System.out.println(node.e);
preOder(node.left);
preOder(node.right);
}
/*
* 简单写法
* 推荐第一种递归写法,逻辑比较清晰。
*
* if(node!=null){
System.out.println(node.e);
preOder(node.left);
preOder(node.right);
* }
*
* */