Java 实现二叉排序树(BST)

文章目录

  • 介绍
  • 实现
    • 先定义一个节点
    • 测试
  • 总结


在这里插入图片描述

介绍

二叉排序树(Binary Search Tree,简称BST)是一种特殊的二叉树,其中每个节点的值都大于其左子树的任意节点值,而小于其右子树的任意节点值。

它具有以下特点

  1. 左子树的值小于根节点的值,右子树的值大于根节点的值;
  2. 左子树和右子树也是二叉排序树;
  3. 二叉排序树的中序遍历结果是一个有序序列。

二叉排序树的应用非常广泛,以下是一些示例

  • 查找操作:由于二叉排序树的特性,可以通过比较节点的值快速进行查找操作。平均时间复杂度为O(log n)。

  • 插入操作:将一个新节点插入到二叉排序树的合适位置,保持树的有序性。平均时间复杂度为O(log n)。

  • 删除操作:删除二叉排序树中的某个节点,需要保持树的有序性。平均时间复杂度为O(log n)。

  • 排序操作:利用二叉排序树的中序遍历结果是有序的特点,可以对一组数据进行排序。

  • 范围查询:通过在二叉排序树上进行中序遍历,可以方便地获取某个范围内的节点。

  • 数据统计:二叉排序树可用于统计某个节点的左子树节点数或右子树节点数,也可以统计整个树的节点数。

实现

先定义一个节点


/*** @description: 节点* @author: Snow* @date: 2024/1/22* *************************************************** 修改记录(时间--修改人--修改说明):*/
public class Node {int value;Node left;Node right;public Node(int value) {this.value = value;}/** 添加节点 */public void add(Node root, Node node){if( node.value <= root.value ){if( root.left == null ){root.left = node;return;}else{add(root.left, node);}}else{if( root.right == null ){root.right = node;return;}else{add(root.right, node);}}}/** 中序遍历 */public void inOrder(Node root){if( root.left != null ){inOrder( root.left );}System.out.print(root.value + " ");if( root.right != null ){inOrder( root.right );}}}

/*** @description: 二叉排序树*  对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当*  前节点的值小,右子节点的值比当前节点的值大。* @author: Snow* @date: 2024/1/22* *************************************************** 修改记录(时间--修改人--修改说明):*/
public class BinarySortTree {//  根节点private Node root;/** 添加节点 */public void add(Node node){if( node == null ){return;}if( root == null ){root = node;return;}root.add(root, node);}/** 中序遍历 */public void inOrder(){if( root == null ){return;}root.inOrder(root);}
}

测试

public class BinarySortTreeTest {public static void main(String[] args) {int[] arr = {7, 3, 10, 12, 5, 1, 9};BinarySortTree binarySortTree = new BinarySortTree();for (int i : arr) {binarySortTree.add(new Node(i));}binarySortTree.inOrder();}
}

总结

需要注意的是,二叉排序树对于具有相同值的节点处理会有一定问题,因为它要求每个节点的值都不相同。因此,在实际应用中,可以针对这个问题进行优化或改进,如在节点上增加一个计数器,来记录具有相同值的节点个数。




在这里插入图片描述



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/641202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

笔记-孙子兵法-第三篇-谋攻(2)-集中优势兵力;将在外君命有所不受;知彼知己,百战不殆;

笔记-From 《华杉讲透孙子兵法》和《兵以诈立&#xff0c;我读孙子》 目录 第三篇-谋攻&#xff08;2&#xff09; 原文&#xff1a; Ankie的笔记-集中优势兵力&#xff1b;将在外君命有所不受&#xff1b;知彼知己&#xff0c;百战不殆&#xff1b; 第三篇-谋攻&#xff08…

有关HTML知识点汇总总结

一、VScode常用快捷键列表 代码格式化&#xff1a;ShiftAltF向上或向下移动一行&#xff1a;AltUp或AltDown快速复制一行代码&#xff1a;ShiftAltUp或ShiftAltDown快速保存&#xff1a;CtrlS快速查找&#xff1a;CtrlF快速替换&#xff1a;CtrlH 二、HTML系列总结 1、什么是H…

用flinkcdc debezium来捕获数据库的删除内容

我在用flinkcdc把数据从sqlserver写到doris 正常情况下sqlserver有删除数据&#xff0c;doris是能捕获到并很快同步删除的。 但是我现在情况是doris做为数仓&#xff0c;数据写到ods&#xff0c;ods的数据还会通过flink计算后写入dwd层&#xff0c;所以此时ods的数据是删除了…

“智赋校园 无忧运营”——聚铭网络2024高校客户沙龙圆满举办

随着信息技术的迅猛发展&#xff0c;高校教育行业正经历着一场前所未有的数字化转型。然而&#xff0c;网络安全问题日益凸显&#xff0c;对高校的教学、科研和管理带来了巨大的挑战。在此背景下&#xff0c;聚铭网络特举办了以“智赋校园 无忧运营”为主题的2024高校客户沙龙&…

搜索与图论第六期 最短路问题

前言 最短路问题真的很重要很重要希望大家都能够完全掌握所有最短路算法&#xff01;&#xff01; 一、最短路问题的分类 Dijkstra&#xff1a; Dijkstra算法是一种著名的图算法&#xff0c;主要用于求解有权图中的单源最短路径问题。它由荷兰计算机科学家艾兹赫尔戴克斯特…

Go 入门

1. hello&#xff0c;world hello&#xff0c;world hello&#xff0c;world 经典示例 package main import "fmt" func main() { fmt.Println("你好&#xff0c;Go") } Go 基础知识Go 是编译型的语言Go 的工具链将程序的源文件转变成机器相关的原…

小红书达人推广模式有哪些,品牌投放策略总结

小红书是一个以种草为核心的平台&#xff0c;而品牌方进行种草时&#xff0c;就需要依托达人的力量。今天我们和大家分享下小红书达人推广模式有哪些&#xff0c;品牌投放策略总结&#xff01; 一、小红书达人推广模式有哪些 1. 明星种草 这种小红书达人推广模式&#xff0c;依…

BioXCell--RecombiMAb anti-mouse CTLA-4 (CD152) (LALA-PG)

9D9-CP008单克隆抗体是原始9D9单克隆抗体的重组嵌合型抗体。可变结构域序列与原始9D9克隆号相同&#xff0c;但是恒定区序列已经从小鼠IgG2b变为小鼠IgG2a。9D9-CP008单克隆抗体在Fc片段中也含有LALA-PG突变&#xff0c;使其无法与内源性Fcγ受体结合。 9D9-CP008单克隆抗体能与…

vue封装接口

目录 封装接口前缀 配置逻辑 接口存放文件 配置代理 获取数据方法 封装接口前缀 config.js const serverConfig {baseURL: "https://xxx.xxxxxxxx.com/api", // 请求基础地址,可根据环境自定义useTokenAuthorization: false, // 是否开启 token 认证};export …

【手写数据库toadb】02 开发数据库内核准备阶段-git工具使用

git工具使用 开发环境 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,…

langchain中的Document类

在Langchain-Chatchat的上传文档接口&#xff08;upload_docs&#xff09;中有个自定义的docs字段&#xff0c;用到了Document类。根据发现指的是from langchain.docstore.document import Document。本文简要对Document类进行介绍。 1.上传文档接口upload_docs def upload_d…

检测到目标SSL证书已过期怎么回事?

在浏览网站时&#xff0c;有时会遇到一个警告&#xff0c;提示目标SSL证书已过期。这是一个令人担忧的信号&#xff0c;意味着网站的安全性可能存在问题。那么&#xff0c;为什么会出现目标SSL证书过期的情况&#xff1f;我们该如何应对呢&#xff1f; 首先&#xff0c;我们需要…

LCD-LMD-PSO-ELM的电能质量分类,LCD特征提取,LMD特征提取,粒子群算法优化极限学习机

目录 背影 极限学习机 LCD-LMD-PSO-ELM的电能质量分类,LCD特征提取,LMD特征提取,粒子群算法优化极限学习机 主要参数 MATLAB代码 效果图 结果分析 展望 完整代码下载链接:LCD-LMD-PSO-ELM的电能质量分类,LCD特征提取,LMD特征提取,粒子群算法优化极限学习机资源-CSDN文库…

【C语言进阶】预处理详解

引言 对预处理的相关知识进行详细的介绍 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 引言 预定义符号 #define定义常量 #define定义宏 带有副作用的宏参数 宏替换的规则 …

理解LSTM一种递归神经网络(RNN)

1 递归神经网络结构 一个简单的传统神经网络结构如下图所示&#xff1a; 给他一些输入x0,x1,x2 … xt, 经过神经元作用之后得到一些对应的输出h0,h1,h2 … ht。每次的训练&#xff0c;神经元和神经元之间不需要传递任何信息。 递归神经网络和传统神经网络不同的一个点在于&am…

Linux 网络传输学习笔记

这篇是混合《Linux性能优化实战》以及 《Wireshark网络分析就这么简单》的一些关于Linux 网络的学习概念和知识点笔记 &#xff0c;主要记录网络传输流程以及对于TCP和UDP传输的一些影响因素 Linux 网络传输流程 借用一张倪朋飞先生的《Linux性能优化实战》课程中的图片 接收流…

利用STM32CubeMX和keil模拟器,3天入门FreeRTOS(2.1) —— 任务挂起和恢复

前言 &#xff08;1&#xff09;FreeRTOS是我一天过完的&#xff0c;由此回忆并且记录一下。个人认为&#xff0c;如果只是入门&#xff0c;利用STM32CubeMX是一个非常好的选择。学习完本系列课程之后&#xff0c;再去学习网上的一些其他课程也许会简单很多。 &#xff08;2&am…

SpringBoot整合FreeMarker

FreeMarker FreeMarker 是一个模板引擎&#xff0c;可以将模板与数据结合生成文本输出。以下是 Java FreeMarker 常用的语法及示例&#xff1a; 输出变量值 使用 ${} 输出变量值&#xff0c;如&#xff1a; ${user.name}条件判断 使用 <#if> 和 <#else> 进行条…

IDEA内置HTTP CLIENT

使用IDEA进行HTTP测试两种方法&#xff1a; a. 在controller层的方法中点击小地球跳转&#xff08;因为方法上带有RequestMapping注解&#xff0c;IDEA识别到这是一个handler&#xff09; b. 在全局任意位置新建右键新建一个HTTP Request&#xff0c;即自动新建一个测试文件。每…

Windows 下ffmpeg安装及实践

Windows 下ffmpeg安装及实践 背景安装实践其他 背景 最近负责音频文件处理相关的业务&#xff0c;涉及到 ffmpeg 对一些音频文件格式的校验&#xff0c;记录一下安装过程及踩坑过程。 安装 如图1所示&#xff0c;进入官网&#xff0c;在windows下任选一个文件&#xff1a;h…