当前位置: 首页 > news >正文

二叉搜索树【Java】

文章目录

    • 二叉搜索树的性质
    • 二叉搜索树的操作
      • 遍历
      • 查找
      • 插入
      • 删除

二叉搜索树又称为二叉排序树,是一种具有一定性质的特殊的二叉树;

二叉搜索树的性质

若它的左子树不为空,则左子树上结点的值均小于根节点的值;
若它的右子树不为空,则右子树上结点的值均大于根节点的值;
二叉搜索树的左右子树均为二叉搜索树;

在这里插入图片描述

二叉搜索树的操作

遍历

关于二叉树的遍历方式有前序、中序、后序三种,对于二叉搜索树而言,使用中序遍历得到的结点序列是有序的;

public class BinarySearchTree {
//首先创建相关的结点结构static class TreeNode {public int key;public TreeNode left;public TreeNode right;TreeNode(int key){this.key=key;}}public TreeNode root;//进行中序遍历public void inorder(TreeNode root){if (root==null) return;inorder(root.left);System.out.println(root.key+" ");inorder(root.right);}
}

查找

基于二叉搜索树的性质,当根节点不为空时,可以根据根节点的值与待查找的值key之间的关系进行查找;即若根节点的值大于key,则在其左子树进行查找;若根节点的值小于key,则到其右子树进行查找;直到最终根节点的值为空或没有找到key则结束;

public TreeNode search(int key){//定义一个cur从根节点的位置开始查找TreeNode cur=root;while (cur!=null){//结点的值与key相等,找到并返回if (cur.key==key){return cur;}else if(cur.key<key){//结点的值小于key,去其右子树进行查找cur=cur.right;}else {//结点的值大于key,去其左子树进行查找cur=cur.left;}}//没有找到,没有该值return null;}

插入

插入操作可以分为2种情况:当根节点为空时,直接插入到根节点即可;当根节点不为空时,就需要遵守搜索树的性质按照之前查找的逻辑,将节点插入合适的位置,保证不破坏其二叉搜索树的结构;

 public boolean insert (int key){//结点为空,直接进行插入if (root==null){root=new TreeNode(key);return true;}//结点不为空//定义一个cur寻找插入的合适位置TreeNode cur=root;//记录cur的位置或走向TreeNode parent=null;//寻找合适的插入位置,使用parent记录while (cur!=null){if (cur.key<key){parent=cur;cur=cur.right;}else if (cur.key<key){parent=cur;cur=cur.left;}else{//不可以插入相同的数据return false;}}//创建新结点TreeNode node=new TreeNode(key);if (parent.key<key){parent.right=node;}else{parent.left=node;}return true;}

删除

删除操作相较于前面的查找插入操作要略显复杂,大致可以分为下面几种情况:

设待删除的结点为cur,待删除节点的双亲结点为parent;

  1. cur.left==null;

cur是root;

在这里插入图片描述
cur不是root,又可以分为2种情况:

cur是其双亲结点parent的左结点:

在这里插入图片描述
cur是其双亲结点parent的右结点:

在这里插入图片描述

  1. cur.right==null;

cur为root;

在这里插入图片描述

cur不是root,又可以分为2种情况:

cur是其双亲结点parent的左结点:

在这里插入图片描述
cur是其双亲结点parent的右结点:

在这里插入图片描述

  1. cur.left!=null && cur.right!=null;

使用替换法进行删除,使用待删除节点的右子树的最小值将待删除节点进行替换,再删除最小值的结点即可;

在这里插入图片描述

下面是具体的代码实现:

public boolean remove(int key){TreeNode cur=root;TreeNode parent=null;//寻找删除的结点的位置while (cur!=null){if (cur.key<key){parent=cur;cur=cur.right;}else if(cur.key==key){//调用removeNode方法进行具体的删除removeNode(parent,cur);return true;}else{parent=cur;cur=cur.left;}}return false;}private void removeNode(TreeNode parent, TreeNode cur) {//第一种情况if (cur.left==null){if (cur==root){root=cur.right;}else if(cur==parent.left){parent.left=cur.right;}else {parent.right=cur.right;}//第二种情况}else if(cur.right==null){if (cur==root){root=cur.left;}else if(cur==parent.left){parent.left=cur.left;}else {parent.right=cur.left;}}else{//第三种情况,使用替换法TreeNode targetParent=cur;TreeNode target=cur.right;//寻找最小值while (target.left!=null){targetParent=target;target=target.left;}//进行替换cur.key=target.key;//删除那个最小值if (target==targetParent.left){targetParent.left=target.right;}else{targetParent.right=target.right;}}}

对于这样一棵二叉搜索树而言,一般情况下结点所处的位置越深,需要进行比较的次数就越多。因此根据结点插入的次序不同,就可能得到不同结构的二叉树:

最好情况下,得到一棵完全二叉树的结构,平均比较次数达到logN(以2为底);
最坏情况下,得到一棵单分支树,平均比较次数为N/2;

over!

相关文章:

二叉搜索树【Java】

文章目录 二叉搜索树的性质二叉搜索树的操作遍历查找插入删除 二叉搜索树又称为二叉排序树&#xff0c;是一种具有一定性质的特殊的二叉树&#xff1b; 二叉搜索树的性质 若它的左子树不为空&#xff0c;则左子树上结点的值均小于根节点的值&#xff1b; 若它的右子树不为空&a…...

二叉树的遍历方式

文章目录 层序遍历——队列实现分析Java完整代码 先序遍历——中左右分析递归实现非递归实现——栈实现 中序遍历——左中右递归实现非递归实现——栈实现 后续遍历——左右中递归实现非递归实现——栈加标志指针实现 总结 层序遍历——队列实现 给你二叉树的根节点 root &…...

SpringCloud01

SpringCloud01 微服务入门案例 实现步骤 导入数据 实现远程调用 MapperScan("cn.itcast.order.mapper") SpringBootApplication public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}…...

SpringBoot整合Redis实现点赞、收藏功能

前言 点赞、收藏功能作为常见的社交功能&#xff0c;是众多Web应用中必不可少的功能之一。而redis作为一个基于内存的高性能key-value存储数据库&#xff0c;可以用来实现这些功能。 本文将介绍如何使用spring boot整合redis实现点赞、收藏功能&#xff0c;并提供前后端页面的…...

【Java入门合集】第一章Java概述

【Java入门合集】第一章Java概述 博主&#xff1a;命运之光 专栏&#xff1a;JAVA入门 学习目标 1.理解JVM、JRE、JDK的概念&#xff1b; 2.掌握Java开发环境的搭建,环境变量的配置&#xff1b; 3.掌握Java程序的编写、编译和运行&#xff1b; 4.学会编写第一个Java程序&#x…...

Android无线调试操作说明

1.首先通过手机机蓝牙将jackpal.androidterm-1.0.70.apk(终端模拟器)传的设备上安装 链接: https://pan.baidu.com/s/151SzEgsX0b_VTWowzfUrsA?pwdrn75 提取码: rn75 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 2.打开这个终端模拟器&#xff0c;输入以下命…...

什么是 Python ?聊一聊Python程序员找工作的六大技巧

最近我一直在思考换工作的事情。因此&#xff0c;这段时间我会看一些题目&#xff0c;看一些与面试相关的内容&#xff0c;以便更好地准备面试。我认为无论你处于什么阶段&#xff0c;面试中都会有技术面试环节。无论是初级职位还是高级职位&#xff0c;都需要通过技术面试来检…...

RabbitMQ 01 概述

什么是消息队列 进行大量的远程调用时&#xff0c;传统的Http方式容易造成阻塞&#xff0c;所以引入了消息队列的概念&#xff0c;即让消息排队&#xff0c;按照队列进行消费。 它能够将发送方发送的信息放入队列中&#xff0c;当新的消息入队时&#xff0c;会通知接收方进行处…...

面经|曹操出行供需策略运营

1.自我介绍 面试官表示看了简历之后&#xff0c;表示对专业能力比较放心。想了解下对于专业能力之外&#xff0c;关于其他方面的介绍。 2.策略运营&#xff0c;除了工具之外&#xff0c;还有哪些能力是需要具备的 回答&#xff1a;主要是从做项目的维度逻辑先去回答的。 分析思…...

【Python】selenium工具

目录 1. 安装 2. 测试 3. 无头浏览器 4. 元素定位 5. 页面滑动 6. 按键、填写登录表单 7. 页面切换 Selenium是Web的自动化测试工具&#xff0c;为网站自动化测试而开发&#xff0c;Selenium可以直接运行在浏览器上&#xff0c;它支持所有主流的浏览器&#xff0c;可以接…...

实验六~Web事件处理与过滤器

1. 创建一个名为exp06的Web项目&#xff0c;编写、部署、测试一个ServletContext事件监听器。 BookBean代码 package org.example.beans;import java.io.Serializable;/*** Created with IntelliJ IDEA.* Description:* User: Li_yizYa* Date: 2023—04—29* Time: 18:39*/ Su…...

刷题4.28

1、 开闭原则软件实体&#xff08;模块&#xff0c;类&#xff0c;方法等&#xff09;应该对扩展开放&#xff0c;对修改关闭&#xff0c;即在设计一个软件系统模块&#xff08;类&#xff0c;方法&#xff09;的时候&#xff0c;应该可以在不修改原有的模块&#xff08;修改关…...

做了一年csgo搬砖项目,还清所有债务:会赚钱的人都在做这件事 !

前段時间&#xff0c;在网上看到一句话&#xff1a;有什么事情&#xff0c;比窮更可怕&#xff1f; 有人回答说&#xff1a;“又忙又窮。” 很扎心&#xff0c;却是绝大多数人的真实写照。 每天拼死拼活的996&#xff0c;你有算过你的時间值多少钱&#xff1f; 我们来算一笔…...

线性回归模型(7大模型)

线性回归模型&#xff08;7大模型&#xff09; 线性回归是人工智能领域中最常用的统计学方法之一。在许多不同的应用领域中&#xff0c;线性回归都是非常有用的&#xff0c;例如金融、医疗、社交网络、推荐系统等等。 在机器学习中&#xff0c;线性回归是最基本的模型之一&am…...

VP记录:Codeforces Round 868 (Div. 2) A~D

传送门:CF A题:A-characteristic 构造一个只有 1 , − 1 1,-1 1,−1的数组,满足乘积为 1 1 1的数对的个数为 k k k. 发现 n n n的范围很小,考虑直接暴力枚举数组中 1 1 1的个数,记为 i i i,那么对于1的所有数对来说,我们有 i ∗ ( i − 1 ) / 2 i*(i-1)/2 i∗(i−1)/2个,然后…...

【VQ-VAE-2论文精读】Generating Diverse High-Fidelity Images with VQ-VAE-2

【VQ-VAE-2论文精读】Generating Diverse High-Fidelity Images with VQ-VAE-2 0、前言Abstract1 Introduction2 Background2.1 Vector Quantized Variational AutoEncoder3 Method3.1 Stage 1: Learning Hierarchical Latent Codes3.2 Stage 2: Learning Priors over Latent C…...

并发编程基石:管程

大家好&#xff0c;我是易安&#xff01; 如果有人问我学习并发并发编程&#xff0c;最核心的技术点是什么&#xff0c;我一定会告诉他&#xff0c;管程技术。Java语言在1.5之前&#xff0c;提供的唯一的并发原语就是管程&#xff0c;而且1.5之后提供的SDK并发包&#xff0c;也…...

电路中噪声来源

电路包括不同的部件和芯片&#xff0c;所有都有可能成为噪声的来源。例如&#xff0c;电阻会带来热噪声&#xff0c;这个噪声为宽频噪声&#xff0c;几乎涵盖所有频率范围&#xff1b;运算放大器其芯片内部会产生噪声&#xff1b;而 ADC产生的量化噪声相较于其他器件&#xff0…...

JAVASE的全面总结

&#xff08;未完待续&#xff09; 五、子类与继承 5.1 子类与父类 继承是一种由已有的类创建新类的机制。利用继承&#xff0c;我们可以先创建一个共有属性的一般类&#xff0c;根据该一般类再创建具有特殊属性的新类&#xff0c;新类继承一般类的状态和行为&#xff0c;并…...

关于repeater录制的流量子调用的identity中带有~S的情况

前段时间同事问我&#xff0c;我们录制的流量中&#xff0c;尤其是dubbo的子调用显示经常他的末尾会带上一个小尾巴这个是什么意思呢&#xff0c;其实之前我没有太在意这个事情&#xff0c;只是同事这么疑问了&#xff0c;确实激起了好奇心&#xff0c;所以就差了下 到底是什么…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...