Java实现二分搜索树的示例代码

yizhihongxing

下面我将详细讲解“Java实现二分搜索树的示例代码”的完整攻略。

什么是二分搜索树?

首先,我们需要明确什么是二分搜索树(BST)。

二分搜索树是一种二叉树,其中每个节点都有一个键值,且每个节点的键值都大于左子树中任意一个节点的键值,小于右子树中任意一个节点的键值。这种性质使得查找、插入、删除节点的操作都可以在时间复杂度为O(logN)的时间内完成,非常适合用于存储需要快速查询的数据。

思路分析

了解了二分搜索树的概念之后,接下来我们就可以思考如何实现它。

思路大致如下:

  • 首先定义二分搜索树节点类BSTNode,包含key值和左右节点引用。
  • 再定义二分搜索树类BST,包含根节点引用和查找、插入、删除等操作。

示例代码

下面是示例代码具体实现。

BSTNode类

public class BSTNode {
    // 键值
    public int key;
    // 左节点
    public BSTNode left;
    // 右节点
    public BSTNode right;

    public BSTNode(int key) {
        this.key = key;
    }
}

BST类

public class BST {
    // 根节点
    private BSTNode root;

    // 查找
    public BSTNode search(int key) {
        return search(root, key);
    }

    private BSTNode search(BSTNode node, int key) {
        if (node == null || node.key == key) {
            return node;
        }
        if (key < node.key) {
            return search(node.left, key);
        }
        return search(node.right, key);
    }

    // 插入
    public void insert(int key) {
        root = insert(root, key);
    }

    private BSTNode insert(BSTNode node, int key) {
        if (node == null) {
            return new BSTNode(key);
        }
        if (key < node.key) {
            node.left = insert(node.left, key);
        } else if (key > node.key) {
            node.right = insert(node.right, key);
        }
        return node;
    }

    // 删除
    public void delete(int key) {
        root = delete(root, key);
    }

    private BSTNode delete(BSTNode node, int key) {
        if (node == null) {
            return null;
        }
        if (key < node.key) {
            node.left = delete(node.left, key);
        } else if (key > node.key) {
            node.right = delete(node.right, key);
        } else {
            if (node.left == null) {
                return node.right;
            } else if (node.right == null) {
                return node.left;
            } else {
                BSTNode temp = node.right;
                while (temp.left != null) {
                    temp = temp.left;
                }
                node.key = temp.key;
                node.right = delete(node.right, node.key);
            }
        }
        return node;
    }
}

我们可以在main函数中测试生成二分搜索树并进行相关的操作。

public static void main(String[] args) {
    BST bst = new BST();
    bst.insert(5);
    bst.insert(3);
    bst.insert(8);
    bst.insert(1);
    bst.insert(4);
    bst.insert(6);
    bst.insert(9);

    System.out.println(bst.search(4));

    bst.delete(4);

    System.out.println(bst.search(4));
}

运行结果为:

BSTNode@3fee733d
null

其中,注释已经比较详细,相信你已经可以看懂代码及其实现原理了。如果有任何疑问可以随时提出,我会为你解答。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现二分搜索树的示例代码 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Java实现将类数据逐行写入CSV文件的方法详解

    下面是详细讲解“Java实现将类数据逐行写入CSV文件的方法详解”的完整攻略。 什么是CSV文件 CSV(Comma Separated Values)即逗号分隔值,是一种常见的在电子表格和数据库中使用的文本文件格式。每一行表示一条记录,每条记录里的各字段之间使用逗号(或其他分隔符)隔开。 操作步骤 创建CSVWriter对象 Java中可以使用第三方库op…

    Java 2023年5月19日
    00
  • Java效率提升神器jOOR

    下面是关于Java效率提升神器jOOR的详细攻略: 什么是jOOR jOOR(Java Object Oriented Reflection)是一组Java工具,它可以大大提高Java中对象的创建、操作和链式调用的效率。它通过简化反射API的使用,提供更灵活、更直观和更简单的方式来处理Java对象。jOOR扩展了Java语言,使它更容易地与其他流行的Java…

    Java 2023年5月26日
    00
  • 详解JAVA中的OPTIONAL

    详解JAVA中的Optional Java中的Optional是Java8中新增的类,用于解决空指针异常。Optional类通过包装对象的形式,判断对象是否为空,从而避免空指针异常。 Optional基本概念 Optional的创建 Optional的创建有两种方法:empty()和of(T value)。 当要创建一个空的Optional对象时,可以使用e…

    Java 2023年5月26日
    00
  • 微信小程序实现分页功能

    下面是“微信小程序实现分页功能”的完整攻略。 1.前置准备 在实现分页功能之前,需要准备好以下内容: 微信小程序开发环境、开发工具(如微信开发者工具); 分页数据的获取接口; 显示分页数据的页面。 2.分页功能实现 2.1 前端页面布局 在前端页面的布局中,需要考虑到分页的展示以及交互方式。一般来说,分页功能需要包含以下元素: 上一页按钮; 下一页按钮; 当…

    Java 2023年5月23日
    00
  • Java中synchronized正确使用方法解析

    Java中synchronized正确使用方法解析 什么是synchronized synchronized是一个对象级别的锁,也称之为内部锁或者特定对象的锁。Java中提供了三种使用synchronized关键字同步代码块的方法。 修饰实例方法,锁的是当前实例对象(this)。 修饰静态方法,锁的是类对象(Class对象)。 修饰代码块,锁的是代码块中的对…

    Java 2023年5月26日
    00
  • 什么是Java代码优化?

    Java代码优化指的是通过改进代码的设计、实现和运行等方面,使得Java程序的性能更高、消耗的资源更少,同时保证程序的正确性和可维护性。下面给出一个Java代码优化的使用攻略。 步骤一:明确优化目标 优化目标应该具体、明确、可衡量以及符合业务需求。可能的优化目标包括: 提高程序的运行速度,减少响应时间。 降低程序的系统资源消耗,例如CPU占用率、内存占用等。…

    Java 2023年5月11日
    00
  • SpringBoot配置数据库密码加密的实现

    为了实现Spring Boot配置数据库密码加密,我们可以使用以下步骤: 配置依赖项 需要添加以下依赖项到项目的pom.xml文件中: <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security…

    Java 2023年5月19日
    00
  • Java实现天天酷跑小游戏完整代码(附源码)

    Java实现天天酷跑小游戏完整代码(附源码) 简介 天天酷跑是一款非常有趣的小游戏,如何在Java中实现这个小游戏呢?以下是完整的Java实现天天酷跑小游戏的代码,包括Java Swing界面、游戏逻辑等部分。 游戏界面 本游戏的界面使用了Java Swing库,实现了基本的图形化界面。其中,我们使用JPanel来绘制游戏场景,使用JLabel来绘制游戏角色…

    Java 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部