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

下面我将详细讲解“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中$符的各种使用场景

    下面是“详解Java中$符的各种使用场景”的完整攻略。 1. $符在Java中的基本用法 $符在Java中可以用作标识符的一部分,可以表示变量名或方法名等。在变量名或方法名中使用$符时需要注意以下几点: $符不能作为变量或方法名的开头,否则会导致编译错误。 $符不建议作为变量或方法名的一部分,因为这样会使代码可读性降低。 举个例子: int a$ = 1; …

    Java 2023年5月19日
    00
  • 简述Java编程之关系操作符

    在讲解Java编程之关系操作符之前,先来了解一下什么是运算符。 运算符是指用于对一定数据类型的变量进行运算操作的一类特殊字符,可以分为算术运算符、关系运算符、逻辑运算符、位运算符等。 Java编程中的关系运算符主要用于比较两个变量之间的关系,得到的结果是boolean类型,即true或false。在Java中用于关系运算的符号有 ==、!=、>、&lt…

    Java 2023年5月26日
    00
  • java8保姆级lambda表达式教程

    Java8保姆级Lambda表达式教程攻略 什么是Lambda表达式 Lambda表达式是Java8中的一项重要特性,它是一种匿名函数,可以将行为像数据一样进行传递和使用。使用Lambda表达式可以简化代码、提高代码可读性和效率。 Lambda表达式语法 ->符号是Lambda表达式的操作符,分为左右两部分。 左侧:参数列表,可以省略参数类型,参数个数…

    Java 2023年5月26日
    00
  • JavaSpringBoot报错“NoClassDefFoundError”的原因和处理方法

    当使用Java的Spring Boot框架时,可能会遇到“NoClassDefFoundError”错误。这个错误通常是由以下原因之一引起的: 缺少依赖项:如果您的应用程序缺少依赖项,则可能会出现此错误。在这种情况下,需要确保所有依赖项都已正确添加。 类路径错误:如果类路径错误,则可能会出现此错误。在这种情况下,需要确保类路径正确。 以下两个实例: 例 1 …

    Java 2023年5月5日
    00
  • 对Java中JSON解析器的一些见解

    让我们来详细讲解一下“对Java中JSON解析器的一些见解”的攻略。 什么是JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript语言的一个子集,用于描述数据的类型和结构。JSON使用键值对的方式表示数据,键和值之间使用冒号(:)分隔,多个键值对之间使用逗号(,)分隔。 Java中的…

    Java 2023年5月26日
    00
  • java多线程模拟交通灯管理系统

    下面我将详细讲解如何编写一个Java多线程模拟交通灯管理系统。 前言 交通灯是城市中必不可少的重要设施之一,能帮助路面交通管理变得更加有序。为了更好地理解交通灯的工作原理,我们可以开发一个Java多线程模拟交通灯管理系统来模拟交通灯的运行过程。 设计思路 我们的系统需要设计两个交通灯对象,即红绿灯和绿红灯,交替更替地工作。为了实现此目的,我们可以使用多线程的…

    Java 2023年5月19日
    00
  • JavaScript代码调试方法实例小结

    我来为您详细讲解“JavaScript代码调试方法实例小结”的完整攻略。 1. 什么是JavaScript代码调试? JavaScript代码调试是指在开发过程中,通过各种工具或方法找出程序代码中的错误或问题,并进行修复的过程。JavaScript是一种高级动态语言,一些问题可能会出现在运行时,因此调试是非常重要的。 2. JavaScript代码调试的方法…

    Java 2023年5月26日
    00
  • java中实现四则运算代码

    Java中实现四则运算代码的攻略如下: 1. 分析需求 首先,我们需要明确需求。四则运算包含加、减、乘、除。我们需要写出代码来实现这些操作,并可以对输入的两个数进行计算返回结果。需要考虑一些特殊的情况,例如除数为0的情况,需要进行错误提示。 2. 确定方法与注释 在实现代码之前,我们需要确定这个方法的输入和输出,以及需要哪些变量和算法。 /** * 四则运算…

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