一、二叉搜索树的概念及特点
二叉搜索树(BLT):Binary Search Tree,又名二叉排序树,二叉查找树,是一种常见的二叉树类型。它是一棵空树或具有以下特点的二叉树:
- 若任意结点的左子树不为空,那么左子树的任意结点的值均小于当前节点的值。
- 若任意结点的右子树不为空,那么右子树的任意结点的值均大于当前节点的值。
- 它的左右子树也均为二叉搜索树。
- 中序遍历可以得到一个有序序列。
树的物理结构如下图所示:
二叉搜索树,顾名思义,是一种方便查找和插入的二叉树,它的查找和插入操作的时间复杂度均为 O(logn)。
我们给出二叉树结点(为了方便讲解,这里的树结点的key值均为Integer类型),代码如下:
public class TreeNode {
Integer key;
TreeNode leftChild;
TreeNode rightChild;
public TreeNode(Integer key, TreeNode leftChild, TreeNode rightChild) {
this.key = key;
this.leftChild = leftChild;
this.rightChild = rightChild;
}
public TreeNode() {
}
}
二、二叉搜索树的相关操作
介绍完二叉搜索树的概念及性质,再来看看二叉搜索树的相关操作。
1、二叉搜索树的查找
如果我们要在二叉搜索树中查找一个值为 value 的结点应该如何去做?此时我们就要充分利用到二叉搜索树的1,2两条特点。
基本思想:
拿 value 跟 根节点 root 比较,如果value小于 root,就从 root 的左子树查找,如果value大于 root 就从 root 的右子树查找。
从上面的思想我们就能看出这里要用到递归或者迭代(本文采用迭代),具体步骤我们在代码中讲解:
// 二叉搜索树的查找操作
public TreeNode search(Integer key) {
// 如果为一颗空树,则没有查询到,直接返回空
if (root == null) {
return null;
}
// 创建一个移动的指针
TreeNode temp = root;
// 遍历该二叉搜索树
while (true) {
// 如果查找的值小于当前指针位置的值,就移动到当前结点的左子树
if (key < temp.key) {
if (temp.leftChild != null) {
temp = temp.leftChild;
// 如果左子树为空,查找失败,返回null
} else {
return null;
}
// 如果查找的值大于当前指针位置的值,就移动到当前结点的右子树
} else if (key > temp.key) {
if (temp.rightChild != null) {
temp = temp.rightChild;
// 如果右子树为空,查找失败,返回null