GitHub源码分享
1. 二叉查找树(Binary Search Tree)
二叉查找树又叫二叉排序树(Binary Sort Tree),或叫二叉搜索树,简称BST。BST是一种节点值之间有次序的二叉树。其特性是:若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
若任意节点的右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值;
任意节点的左、右子树也分别为二叉查找树;
二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低,为$O(logN)$。用大$O$符号表示的时间复杂度:算法平均最差空间$O(N)$$O(N)$
搜索$O(logN)$$O(N)$
插入$O(logN)$$O(N)$
删除$O(logN)$$O(N)$
2. BST的实现
二叉查找树要求所有的节点元素都能够排序,所以我们的Node节点类需要实现Comparable接口,树中的两个元素可以使用compareTo方法进行比较。
我们节点中元素的类型为int型,所以该接口泛型为Comparable,下面是具体实现:
2.1 节点类element 为数据元素
left 为左子节点
right 为右子节点class Node implements Comparable {
private final int element; // 数据元素
private Node left; // 左子树
private Node right; // 右子树
private Node(Integer element) {
this.element = element;
}
@Override
public int compareTo(Integer o) {
return o.compareTo(element);
}
}
2.2 二叉查找树类root 为树根,所有的操作均始于此
后面会在该类中增加其他方法,如添加、查找、删除等class BinarySearchTree {
private Node root; // 树根
}
3. 插入节点
向二叉查找树中插入的节点总是叶子节点,插入过程如下:若root为空,则将插入节点设为root
当前元素与插入元素通过compareTo进行比较,若插入元素值小,并且左子节点left为空,则插入至当前节点左子节点;否则继续递归
若插入元素值大,且右子节点right为空,则插入至当前节点右子节点;否则继续递归。
若插入元素等于当前节点元素,则插入失败。注:也可以将其插入到右子节点,我这里为了方便直接放弃插入。
具体实现:
在BinarySearchTree类中添加两个方法:public boolean add(int element) 为公开方法
private boolean add(Node node, int element)为私有方法,内部递归使用// 添加元素
public boolean add(int element) {
if (root == null) {
root = new Node(element);
return true;
}
return add(root, element);
}
// 添加元素(递归)
private boolean add(Node node, int element) {
if (node.compareTo(element) < 0) {
if (node.left == null) {
node.left = new Node(element);
return true;
} else {
return add(node.left, element);
}
} else if (node.compareTo(element) > 0) {
if (node.right == null) {
node.right = new Node(element);
return true;
} else {
return add(node.right, element);
}
} else {
return false;
}
}
4. 查找节点
通过二叉查找树查找元素,其过程如下:若root为空,则查找失败
将当前元素与目标元素对比,若相等则查找成功。
若不相等,则继续递归查找:若目标值小于当前节点值,则查找左子树;否则,查找右子树。
具体实现:
在BinarySearchTree类中添加两个方法:public Node find(int element) 为公开方法
private Node find(Node node, int element)为私有方法,内部递归使用// 查找元素
public Node find(int element) {
if (root == null) {
return null;
}
return find(root, element);
}
// 查询元素(递归)
private Node find(Node node, int element) {
if (node == null) {
return null;
}
int compareResult = node.compareTo(elem