持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
前言
上一篇文章中我们了解了二叉树的概念,以及几种操作方式,那么今天我们就来介绍二叉树的一种类型——二叉查找树,我们会介绍二叉树的概念,以及在一个二叉树上如何进行查找操作,插入操作,以及删除操作。最后分析二叉查找树的时间复杂度。
二叉查找树
二叉查找树是二叉树常用的类型之一,也称做二叉搜索树。二叉查找树可用于快速查找数据。以及快速插入操作,快速删除操作。二叉查找树的定义是在二叉树的定义的基础上。在树中的任意节点,其左子树中的每个节点的值,都要小于这个节点的值,其右子树节点的值都大于这个节点的值。
二叉查找树的查找操作
二叉查找树的查找操作的逻辑是这样的,从根节点出发,如果它的值等于我们要查找的值,那么就可以直接返回,假如这个值小于当前节点的值,就到左子树继续递归查找,如果这个值大于当前节点的值,就到右子树中继续递归查找。直到找到该值为止。根据这个公式我们可以推导出递归公式
find(tree, data) => data == tree.data return tree;
data < tree.data find(tree.left, data)
data > tree.data find(tree.right, data)
根据递归公式我们可以很快的写出对应的代码实现。以下我用Foreach循环来代替递归。
class Node {
public int data;
public Node left;
public Node right;
}
public Node find(int data) {
Node node = tree;
while (node != null) {
if (data == node.data) {
return node;
} else if (data < node.data) {
node = node.left;
} else {
node = node.right;
}
}
return null;
}
二叉查找树的插入操作
二叉查找树的插入操作也同它的查找差不多的,都是运用了二叉查找树的基本概念。首先是判断根节点是否存在,如果不存在则直接将改插入节点定义成根节点。如果当前节点存在的话,如果判断插入的值大于当前节点,并且当前节点的右子节点为空,则将插入节点赋值上去,否则就将右子节点赋值给当前节点,继续刚才的判断操作。如果插入节点小于等于当前节点,则使用左子节点运用上面的规则。具体的实现代码如下:
public void insert(int data) {
Node node = tree;
if (tree == null) {
node = new Node(data);
}
while (node != null) {
if (data > node.data) {
if (node.right == null) {
node.right = new Node(data);
return;
}
node = node.right;
} else {
if (node.left == null) {
node.left = new Node(data);
return;
}
node = node.left;
}
}
}
总结
今天介绍了二叉查找树的查找操作和删除操作。