二分搜索树:每个节点的值大于其左子树的所有节点的值,小于其右子树的所有节点的值,它的每一颗子树也是二分搜索树
定义一个二分搜索树:
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 = null;
private int size;public BST() {
root = null;
size = 0;
}public int size() {
return size;
}public boolean isEmpy() {
return size == 0;
}
add操作:比根当前节点小的,就放到 该节点的左子树,否则就放到右子树
public void add(E e) {
root = add(root, e);}
private Node add(Node node, E e) {
if (node == null)
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;}
前序遍历:
public void preOrder(){
preOrder(root);
}private void preOrder(Node node) {
if (node == null)
return;System.out.println(node.e);
preOrder(node.left);
preOrder(node.right);}
层序遍历 借助队列
//层序遍历
public void levelOrder(){
Queue<Node> queue = new LinkedList<>();
queue.add(root);
while(queue!=null){
Node cur = queue.remove();
System.out.println(cur.e);
if(cur.left!=null)
queue.add(cur.left);
if(cur.right!=null)
queue.add(cur.right);
}
}
找最小值
public E minNum(){
return minNum(root).e;
}
private Node minNum(Node node){
if(node.left==null)
return node;
return minNum(node.left);
}
移除最小值
public E removeMin(){
E ret = (E) minNum(root);
root =removMin(root);
return ret;
}private Node removMin(Node node) {
if(root.left ==null){
Node rightNode =root.right;
node.right =null;
size--;
return rightNode;
}
node.left = removMin(node.left);
return node;
}
删除节点
public void remove(E e){
root = remove (root,e);
}private Node remove(Node node, E e) {
if(node ==null)
return null;
if(e.compareTo(node.e)<0){
node.left = remove (node.left,e);
return node;
}
if(e.compareTo(node.e)<0){
node.right=remove(node.right,e);
return node;
}
else{//node.e==e
if(node.left==null){
Node rightNode = node.right;
node.right =null;
size--;
return rightNode;
}
if(node.right==null){
Node leftNode = node.left;
node.left =null;
size--;
return leftNode;
}
//左右子树都不为空
Node successor = minNum(node.right);
successor.right= removMin(node.right);
successor.left =node.left;
node.left =null;
node.right = null;
return successor;
}
}