详解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日

相关文章

  • Java中判断字符串是否相等的实现

    下面是“Java中判断字符串是否相等的实现”的完整攻略。 一、Java中字符串的比较 Java中字符串比较的基本原理是比较字符串的内容是否相等。由于String类型是一个final类,所以String对象在被创建后就不能再被修改了,因此在Java当中比较两个字符串的时候,不能使用”==”运算符。应该使用equals()方法或equalsIgnoreCase(…

    Java 2023年5月26日
    00
  • 关于Java中方法重载和方法重写

    方法重写是子类继承父类(默认继承Object类)后覆盖父类的方法 需要保证同名 同参 同返回值 且访问权限范围不能缩小(public>protected>default>private) public class Father{ public int method(){ return -1; } } class Son extends Fa…

    Java 2023年4月22日
    00
  • 什么是Java线程安全性?

    什么是Java线程安全性 Java线程安全性指的是当多个线程同时访问同一个对象时,保证该对象的行为(包括数据和状态)能够正确地被所有线程访问,而不需要担心数据竞争、死锁等并发问题的发生。 实现Java线程安全的方式有多种,例如使用锁、原子性操作等。 如何实现Java线程安全 以下是几种常见的实现Java线程安全方式: 使用synchronized同步方法 使…

    Java 2023年5月11日
    00
  • Java File类提供的方法与操作

    首先我们来讲解Java的File类提供的方法与操作。File类是Java语言中常用的文件操作类,可以实现文件或目录的创建、删除、重命名等操作。下面是File类提供的一些常用方法: 1. 路径和文件名 1.1 getPath() 获取文件路径。 File file = new File("test.txt"); System.out.pri…

    Java 2023年5月20日
    00
  • jsp要实现屏蔽退格键问题探讨

    为了实现在JSP页面中屏蔽退格键,我们需要进行以下步骤: 1. 绑定onkeydown事件 在需要进行屏蔽退格键的input元素上,绑定onkeydown事件,具体方式为在输入框的标签上添加onkeydown属性,并赋值一个javascript回调函数。以下是示例代码: <input type="text" name="u…

    Java 2023年6月15日
    00
  • java中自定义Spring Security权限控制管理示例(实战篇)

    下面是“java中自定义Spring Security权限控制管理示例(实战篇)”的完整攻略,包含两条示例。 简介 Spring Security是保护基于Spring的应用程序的安全性的框架。其提供的安全功能包括身份验证、授权和攻击防范。在此基础上,Spring Security也支持自定义实现权限控制管理。本篇文章将介绍如何在Java项目中自定义Spri…

    Java 2023年5月20日
    00
  • Maven pom.xml与settings.xml详解

    Maven是一个流行的Java构建工具,是基于项目对象模型(Project Object Model, POM)进行构建的。POM是一个XML文件,描述了项目的依赖关系、构建环境、代码目录、打包、部署等信息。POM通过继承机制实现了依赖管理和构建配置的复用,是Maven强大的特性之一。而settings.xml是Maven的配置文件,它包含了Maven的配置…

    Java 2023年5月20日
    00
  • springmvc—handlermapping三种映射方式

    Spring MVC是一种基于Java的Web框架,它提供了多种方式来处理请求和响应。其中,Handler Mapping是Spring MVC中的一个重要组件,它用于将请求映射到相应的控制器方法。在Spring MVC中,有三种常用的Handler Mapping方式:BeanNameUrlHandlerMapping、RequestMappingHand…

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