1、二分搜索树简介
二分搜索树又称为二叉搜索树、排序二叉树等,是指一棵空树或者具有以下性质的二叉树:
- 若任意一个结点的左子树不为空,则左子树所有结点的值均小于它的根结点的值
- 若任意一个结点的右子树不为空,则右子树所有结点的值均大于它的根结点的值
- 任意结点的左右子树分别也为二分搜索树
- 没有数值相等的结点
二分搜索树是一种基本的数据结构,可以用来构建更为抽象的数据结构,如:set、map等。
二分搜索树和其他数据结构相比较优势在于插入和查找时间复杂度低,为O(logn)。
2、二分搜索树的实现
2.1 树结点的定义
注意:BST定义时,泛型需要继承Comparable接口,只有具有可比较性的数据类型,才能构建二分搜索树。
public class BST<E extends Comparable<E>> {...}
在BST定义内部类Node:
private class Node {
public E e; //结点存储的数据
public Node left; //左孩子
public Node right; //右孩子
public Node(E e) {
this.e = e;
this.left = null;
this.right = null;
}
}
2.2 初始化BST
private Node root;//根结点
private int size;
public BST() {//构造方法
root = null;
size = 0;
}
2.3 获取size和判空
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
2.4 向BST中添加结点
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.left = add(node.left, e);
} else if(e.compareTo(node.e) > 0) {
node.right = add(node.right, e);
}//这里并没有对值相等进行判断,因为此BST不支持重复元素
return node;
}
2.5 判断BST中是否包含某个元素
public boolean contains(E e) {
return contains(root, e);
}
public 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 {//e.compareTo(node.e) > 0
return contains(node.right, e);
}
}
2.6 前序遍历
递归实现:
public void preOrder() {
preOrder(root);
}
//前序遍历--递归算法
private void preOrder(Node node) {
if(node == null) {
return;
}
System.out.println(node.e);
preOrder(node.left);
preOr