0. 前言
大家好,我是多选参数的程序锅,一个正在”研究“操作系统、学数据结构和算法以及 Java 的疯狂猛补生。本篇将带来的是二叉查找树的相关知识,知识提纲如图所示。
另外由于极客时间的《数据结构也算法之美》专栏的图太好看了,所以本篇很多地方直接使用了专栏的图片。

1. 基本介绍
二叉查找树又名二叉搜索树又或者叫做二叉排序树,是二叉树中最常用的一种类型。二叉查找树是为了实现快速查找而生的。除了支持动态数据集合的快速查找之外,还支持动态数据集合的快速插入或删除一个数据。
之所以可以快速插入、删除、查找一个数据,是因为二叉查找树的特殊结构。二叉查找树要求树中的任何一个节点,其左子树的每个节点的值都要小于这个节点的值,而右子树的每个节点的值都大于这个节点的值。如图所示。

2. 查找操作
先取根节点,如果根节点就等于我们要查找的数据,那就返回。如果要查找的数据比根节点要小,那么就在左子树中递归查找;如果要查找的数据比根节点的值大,那就在右子树中递归查找。

实现的代码如下所示:
public Node findNode(int data) {
Node p = this.tree;
while (p != null) {
if (p.data == data) {
return p;
} else if (p.data < data) {
p = p.right;
} else {
p = p.left;
}
}
return null;
}
3. 插入操作
类似于查找操作,我们只需要从根节点开始,依次比较要插入的数据和节点的大小关系。这里先考虑插入数据跟已有数据不重复。如果插入的数据比节点的数据大,并且节点的右子树为空,那么直接插到右子节点的位置;如果不为空,则再递归遍历右子树,查找插入的位置。同理,如果要插入的数据比节点的数值小也是类似的。

实现的代码如下所示:
public void addNode(int data) {
if (this.tree == null) {
this.tree = new Node(data);
return;
}
Node p = this.tree;
while (p != null) {
if (p.data < data) {
if (p.right == null) {