详解Java二叉排序树

详解Java二叉排序树

什么是二叉排序树

二叉排序树是一种特殊的二叉树,它满足如下条件:

  1. 左子树上所有节点的值均小于它的根节点的值。
  2. 右子树上所有节点的值均大于它的根节点的值。
  3. 左、右子树也分别为二叉排序树。

二叉排序树可以使用它的特殊性质进行快速查找、插入、删除等操作。

实现二叉排序树

实现二叉排序树需要定义二叉树节点类以及二叉排序树类:

class Node {
    int val;
    Node left;
    Node right;
    public Node(int val) {
        this.val = val;
    }
}

class BST {
    private Node root;
    public BST() {
        root = null;
    }
    // insert a value into the tree
    public void insert(int val) {
        root = insert(root, val);
    }
    private Node insert(Node node, int val) {
        if (node == null) {
            node = new Node(val);
            return node;
        }
        if (val < node.val) {
            node.left = insert(node.left, val);
        } else if (val > node.val) {
            node.right = insert(node.right, val);
        }
        return node;
    }
    // search a value from the tree
    public boolean search(int val) {
        return search(root, val);
    }
    private boolean search(Node node, int val) {
        if (node == null) {
            return false;
        }
        if (val == node.val) {
            return true;
        } else if (val < node.val) {
            return search(node.left, val);
        } else {
            return search(node.right, val);
        }
    }
    // delete a value from the tree
    public void delete(int val) {
        root = delete(root, val);
    }
    private Node delete(Node node, int val) {
        if (node == null) {
            return null;
        }
        if (val < node.val) {
            node.left = delete(node.left, val);
        } else if (val > node.val) {
            node.right = delete(node.right, val);
        } else {
            if (node.left == null) {
                return node.right;
            }
            if (node.right == null) {
                return node.left;
            }
            Node minNode = findMin(node.right);
            node.val = minNode.val;
            node.right = delete(node.right, minNode.val);
        }
        return node;
    }
    private Node findMin(Node node) {
        while (node.left != null) {
            node = node.left;
        }
        return node;
    }
}

示例说明

示例一:插入、查找、删除操作

BST bst = new BST();
bst.insert(5);
bst.insert(3);
bst.insert(7);
System.out.println(bst.search(3)); // true
System.out.println(bst.search(4)); // false
bst.delete(5);
System.out.println(bst.search(5)); // false

运行结果:

true
false
false

示例二:使用二叉排序树实现顺序输出

利用二叉排序树的特性,可以将一组数据按顺序插入二叉排序树,然后中序遍历输出,即可实现顺序输出。

public static void printSorted(int[] arr) {
    BST bst = new BST();
    for (int val : arr) {
        bst.insert(val);
    }
    printSorted(bst.root);
}
private static void printSorted(Node node) {
    if (node == null) {
        return;
    }
    printSorted(node.left);
    System.out.println(node.val);
    printSorted(node.right);
}

调用示例:

int[] arr = {5, 3, 7, 2, 4, 6, 8};
printSorted(arr);

运行结果:

2
3
4
5
6
7
8

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java二叉排序树 - Python技术站

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

相关文章

  • Mybatis分页的4种方式实例

    针对“Mybatis分页的4种方式实例”的完整攻略,我提供如下的讲解: 概述 在使用Mybatis进行数据查询时,分页查询是一项非常常见的需求。而Mybatis提供了4种方式来实现分页查询,分别是: 使用RowBounds进行物理分页 使用Mybatis自带的PageHelper进行物理分页 使用Mybatis插件实现物理分页 在SQL语句中使用limit进…

    Java 2023年5月20日
    00
  • java web实现简单登录注册功能全过程(eclipse,mysql)

    接下来我详细讲解如何使用Java Web实现简单的登录注册功能全过程,以下是步骤: 步骤一:配置开发环境 在开始项目之前,我们需要搭建好相应的开发环境,主要包括Java SE、Eclipse IDE、MySQL等工具和环境的安装和配置工作。 步骤二:创建Maven Web项目 在Eclipse IDE中创建一个Maven Web项目,建议使用Spring框架…

    Java 2023年6月16日
    00
  • Java使用@Validated注解进行参数验证的方法

    下面是详细的讲解。 一、什么是@Validated注解? 在Java中,我们经常需要对请求传入的参数进行验证。为了实现验证,我们需要使用注解。而@Validated注解就是Spring框架中用于对方法入参进行校验的注解之一。它一般与@RequestParam、@RequestBody等注解结合使用。 二、使用@Validated注解进行参数验证的方法 1. …

    Java 2023年5月26日
    00
  • java中通用的线程池实例代码

    下面就为大家详细讲解java中通用的线程池实例代码的完整攻略。 1. 线程池的概念 在java中,线程池是一个预先构建的线程集合,以便在需要执行任意数量的任务时重复使用线程,而不需要频繁地创建新线程。线程池中的线程可以在执行一些任务后重新被分配给新的任务,这样可以避免线程的频繁创建和销毁,从而提高了线程的利用率。 2. 如何使用线程池 在Java中,线程池是…

    Java 2023年5月30日
    00
  • Java 数组差集实例代码

    当我们需要对两个数组进行差集运算时,就需要使用到Java的数组差集操作。下面是Java 数组差集实例代码的完整攻略: 1. 定义两个数组 假设有两个数组A和B,我们需要求它们的差集。因此,首先需要定义这两个数组。可以使用以下示例代码: int[] A = {1, 2, 3, 4, 5}; int[] B = {3, 4, 5, 6, 7}; 2. 寻找差集 …

    Java 2023年5月26日
    00
  • Java入门6(String和封装类)

    使用第三方jar包,完成get/set操作 Lombok,结合特殊的注解,实现setter和getter的自动生成 导入jar包 使用插件Lombok 在类里import 即可使用 import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; //…

    Java 2023年4月19日
    00
  • Java如何读写Properties配置文件(Properties类)

    下面我将详细讲解“Java如何读写Properties配置文件(Properties类)”的完整攻略。 什么是Properties配置文件 Properties文件是Java中一种非常常用的配置文件格式,它采用Key-Value的形式存储数据,是一种轻量级的配置文件。Properties文件一般用于存储应用程序配置信息,如数据库连接信息、系统配置信息等。 P…

    Java 2023年6月15日
    00
  • Java多线程编程基石ThreadPoolExecutor示例详解

    Java多线程编程基石ThreadPoolExecutor示例详解 简介 Java的多线程编程需要使用线程池Thread Pool。线程池是一组线程集合,可以被执行多次,且必须共享一份线程队列和一个线程池。ThreadPoolExecutor是Java中一个高级线程池,提供了许多用于线程池管理的功能。本文将详细介绍ThreadPoolExecutor的相关内…

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