漫谈数据结构——二叉查找树(上)

82 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;
        }
    }
}

总结

今天介绍了二叉查找树的查找操作和删除操作。