文章目录
1.什么是BST树
Bst树又名二分搜索树,binary search tree,它是遵循一定规律的二叉树;
- 1.二分搜索树是二叉树;
- 2.二分搜索树每个节点的值:
a.大于其左子树所有节点的值;
b.小于其右子树所有节点的值; - 3.每一棵子树也是二分搜索树;
如图:
就是说每往一个根节点添加元素时,左孩子要比根节点小,右孩子要比根节点大,不允许元素重复(可选项);
2.手写一个基本的BST树
下面开始用java写一个Bst树,主要分为几步:
- 基本节点
- add元素流程
- query元素流程 //todo
- 遍历(先中后序)
- 删除元素 //todo
另外补充下:为何说是"基本的",因为还存在可优化的情况,但是不揉在一起,先把最基本的怼出来,下一小节再来考虑优化问题(基本流程,递归);
2.1.定义基本节点
定义好左孩子右孩子,根节点;
public class BinarySearchTree<T extends Comparable> {
Node root;
int size;
class Node {
Node left;
Node right;
T value = null;
public Node(T value) {
this.value = value;
}
}
}
2.2.add元素流程
1.如果root为空则直接new一个,并将值添加给该节点;
2.如果不为空,则将值添加进节点,根据之前描述的二分搜索树的特性,左孩子比根小,右孩子比根大,那么就涉及对比(这里用的java泛型+比较器的方式),那么就需要另开一个函数接受一个Node和新传进来的值进行对比,就是下面代码的私有方法nodeadd()
;
public class BinarySearchTree<T extends Comparable> {
......
class Node {
......
}
public void add(T value) {
if (root == null) {
root = new Node(value);//1
size++;
return;
} else {
nodeAdd(root, value);//2
}
}
/**
* @param currNode 当前根节点
* @param newValue 新插入元素
*/
/**
* 二分搜索树每个节点的值:
* a.大于其左子树所有节点的值;
* b.小于其右子树所有节点的值;
*/
private void nodeAdd(Node currRoot, T newValue) {
//无重复元素
if (currRoot.value.compareTo(newValue) == 0) {
return;
}
//compareTo 前一个元素和后一个元素比较--返回整数,1,0,-1;返回1表示大于,返回-1表示小于,返回0表示相等;
if (currRoot.value.compareTo(newValue) > 0) {
//左插
//当前根节点大于插入值,且当前根节点的左子树为空,所以该值应该插入左子树
if (currRoot.left == null) {
currRoot.left = new Node(newValue);
size++;
return;
} else {
//当前根节点大于插入值,且当前根节点的左子树不为空,则递归到一次的左子树查询当中去
nodeAdd(currRoot.left, newValue);//递归
}
} else if (currRoot.value.compareTo(newValue) < 0) {
//右插
//右插同理左插
if (currRoot.right == null) {
currRoot.right = new Node(newValue);
size++