0. 前言
大家好,我是多选参数的程序锅,一个正在”研究“操作系统、学数据结构和算法以及 Java 的疯狂猛补生。本篇将带来的是二叉查找树的相关知识,知识提纲如图所示。
另外由于极客时间的《数据结构也算法之美》专栏的图太好看了,所以本篇很多地方直接使用了专栏的图片。
![](https://i-blog.csdnimg.cn/blog_migrate/1bb47a766adf3e21a7cf987df3a42fa9.png)
1. 基本介绍
二叉查找树又名二叉搜索树又或者叫做二叉排序树,是二叉树中最常用的一种类型。二叉查找树是为了实现快速查找而生的。除了支持动态数据集合的快速查找之外,还支持动态数据集合的快速插入或删除一个数据。
之所以可以快速插入、删除、查找一个数据,是因为二叉查找树的特殊结构。二叉查找树要求树中的任何一个节点,其左子树的每个节点的值都要小于这个节点的值,而右子树的每个节点的值都大于这个节点的值。如图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/f5170c96d609df656c7df94cb9fafaeb.png)
2. 查找操作
先取根节点,如果根节点就等于我们要查找的数据,那就返回。如果要查找的数据比根节点要小,那么就在左子树中递归查找;如果要查找的数据比根节点的值大,那就在右子树中递归查找。
![](https://i-blog.csdnimg.cn/blog_migrate/df41ea11f4a7ded2e41981421dbcbc1a.png)
实现的代码如下所示:
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. 插入操作
类似于查找操作,我们只需要从根节点开始,依次比较要插入的数据和节点的大小关系。这里先考虑插入数据跟已有数据不重复。如果插入的数据比节点的数据大,并且节点的右子树为空,那么直接插到右子节点的位置;如果不为空,则再递归遍历右子树,查找插入的位置。同理,如果要插入的数据比节点的数值小也是类似的。
![](https://i-blog.csdnimg.cn/blog_migrate/205839c3e8261267b31fb9c4d2597c71.png)
实现的代码如下所示:
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) {