二叉查找树

一、实验题目

(1)实验题目
二叉查找树
(2)问题描述
对于查找集合进行动态查找,为了使得元素的插入、删除和查找操作都能够很快地完成,可以采用二叉查找树作为查找结构。对于给定的查找集合,给出在二叉查找树上进行查找的比较次数。

二、实验内容

(1)设计二叉查找树的存储结构;
(2)用伪代码描述算法,并分析时空性能;
(3)编程实现。

三、数据结构设计

底层使用二叉排序树,根据节点的插入建树,基于查找的方法,进行改进,以满足题目要求.
//使用内部类定义一个节点
static class TreeNode{
public int val ;
public TreeNode left;
public TreeNode right;
public TreeNode(int val) {
this.val = val;
}

//使用接口,定义使用到的方法
public interface IList {
void insert(int val);//节点的插入
int search(int val);//查找
}

四、算法设计

(1)insert(int val) :
需要找到插入的位置:通过循环遍历实现,初始条件为cur = root,结束条件为 cur = null;
如果cur.val < val ,说明根节点的值较小,需要向右子树遍历,即cur = cur.right,
如果cur.val > val ,说明根节点的值较大,需要向左子树遍历,即cur = cur.left;
如果cur.val = val ,说明要插入的节点已经存在,直接返回即可.
经过上面的分析,循环结束,cur =null,显然是不行的,所以要定义一个parent 引用,当cur要移动前,parent指向cur,然后cur再移动 ;
时间复杂度:O(log2 N)
空间复杂度:O(1)
(2)search(int val)
依然采用循环遍历的方式,初始条件为cur = root,结束条件为cur = null,每遍历一次,让计数器++;
时间复杂度:O(log2 N)
空间复杂度:O(1)

五、运行结果

在这里插入图片描述

六、程序源码


```cpp```cpp```cpp```cpp//使用接口,定义使用到的方法
public interface IList {void insert(int val);//节点的插入int search(int val);//查找
}
public class BinarySearchTree implements IList {//使用内部类定义一个节点static class TreeNode{public int val ;public TreeNode left;public TreeNode right;public TreeNode(int val) {this.val = val;}}public TreeNode root;public void insert(int val) {TreeNode node = new TreeNode(val);if(root == null){root =node;return;}TreeNode cur = root;TreeNode parent = null;while(cur != null){if(cur.val < val) {parent = cur;cur = cur.right;}else if(cur.val > val){parent = cur;cur =cur.left;}else {//插入元素已经存在,无法插入,直接返回return;}}if(parent.val < val){parent.right = node;}else{parent.left = node;}}public int search(int val){if(root == null){return -1;}int count = 0;//计数器TreeNode cur = root;while(cur != null){if(cur.val < val){cur = cur.right;count++;}else if(cur.val > val){cur = cur.left;count++;}else {count++;return count;}}return -1 ;//没找到返回-1}}
//测试类
public class Test {public static void main(String[] args) {BinarySearchTree binarySearchTree = new BinarySearchTree();System.out.println("请输入二叉排序树的节点个数:");Scanner scanner =new Scanner(System.in);int number = scanner.nextInt();System.out.println("请输入要插入的节点:");for (int i = 0; i < number; i++) {int val = scanner.nextInt();binarySearchTree.insert(val);}System.out.println("请输入要查找的值:");int elem = scanner.nextInt();System.out.print("查找次数: ");System.out.println(binarySearchTree.search(elem));}
}

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

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

相关文章

UFS协议—新手快速入门(二)【5-6】

目录 五、UFS协议栈 六、UFS技术演进与详解 1、UFS应用层 设备管理器 任务管理器 2、UFS传输层 3、UFS互联层 UFS协议—新手快速入门&#xff08;一&#xff09;【1-4】 五、UFS协议栈 UFS&#xff08;Universal Flash Storage&#xff09;协议是针对固态存储设备&…

【UE5教程】使用蓝图显示鼠标

首先&#xff0c;在您的项目中创建一个新的蓝图类&#xff0c;继承自PlayerController。在蓝图编辑器中&#xff0c;找到Event BeginPlay节点&#xff0c;并从它引出一条线。添加Set Show Mouse Cursor节点&#xff0c;勾选Visible&#xff0c;以确保鼠标在游戏开始时可见。 鼠…

SpringCloud Consul基础入门与使用实践总结

【1】Consul简介 官网地址&#xff1a;https://www.consul.io/intro/index.html 下载地址&#xff1a;https://www.consul.io/downloads.html 中文文档&#xff1a;https://www.springcloud.cc/spring-cloud-consul.html ① 基础概念 Consul 是一套开源的分布式服务发现和…

AI网络爬虫:对网页指定区域批量截图

对网页指定区域批量截图&#xff0c;可以在deepseek的代码助手中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;一步一步的思考&#xff0c;完成一个对网页指定区域截图的python脚本的任务&#xff0c;具体步骤如下&#xff1a; 设置User-Agent: Mozilla/5.0 (…

Visual C++2010学习版详细安装教程(超详细图文)

Visual C 介绍 Visual C&#xff08;简称VC&#xff09;是微软公司推出的一种集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于开发C和C语言的应用程序。它提供了强大的编辑器、编译器、调试器、库和框架支持&#xff0c;以及丰富的工具和选项&#xff0c;使得开…

Android约束布局ConstraintLayout的使用

Android引入约束布局的目的是为了减少布局层级的嵌套&#xff0c;从而提升渲染性能。约束布局综合线性布局、相对布局、帧布局的部分功能&#xff0c;缺点也很明显&#xff0c;就是可能要多写几行代码。所以约束布局使用时&#xff0c;还得综合考虑代码量。提升性能也并不一定非…

CTFHUB-技能树-web-web前置技能-HTTP协议全

目录 1.请求方式 2.302跳转 3.Cookie 4.基础认证 5.响应包源码 1.请求方式 curl -v -X http://challenge-3022c877a8dcedeb.sandbox.ctfhub.com:10800/index.php 2.302跳转 参考链接&#xff1a;http://t.csdnimg.cn/aqdNG 301——永久性重定向。该状态码表示请求的资源已…

LangChain知识库构建与RAG设计

RAG:检索增强生成是什么? RAG的主要流程 Retrieval-Augmented Generation: 检索增强生成 能够根据问题的特点还有上下文, 生成更加个性化和精确的回答 为LLM提供来自外部知识源的额外信息的概念。这允许它们生成更准确和有上下文的答案&#xff0c;同时减少幻觉(1)检索&…

初识C++ · 模拟实现stack和Queue

目录 前言&#xff1a; 1 Stack 1.1 双端队列 2 Queue 前言&#xff1a; 经历了list三个自定义类型的洗礼&#xff0c;来个简单的放松放松&#xff0c;即栈和队列&#xff1a; 文档记录的&#xff0c;栈和队列是一种容器适配器&#xff0c;它们不属于stl&#xff0c;但是它…

平板显示LED背光芯片OC6700,输入3.6V~60V,升压型 LED 恒流驱动器

概述 OC6700是一款内置60V功率NMOS高效率、高精度的升压型大功率LED恒流驱动芯片。OC6700采用固定关断时间的控制方式&#xff0c;关断时间可通过外部电容进行调节&#xff0c;工作频率可根据用户要求而改变。OC6700通过调节外置的电流采样电阻&#xff0c;能控制高亮度LED灯的…

LangChain v0.2介绍

LangChain v0.2介绍 LangSmith&#xff1a;一个开发者平台&#xff0c;可调试、测试、评估和监控LLM应用程序。 LangServe&#xff1a;用于将 LangChain 链部署为 REST API 的包。可以轻松启动并运行生产就绪的 API。 LangChain&#xff1a;包含构成认知架构的链、代理和检索策…

香橙派Orange AI Pro / 华为昇腾310芯片 部署自己训练的yolov8模型进行中国象棋识别

香橙派Orange AI Pro / 华为昇腾310芯片 部署自己训练的yolov8模型进行中国象棋识别 一、香橙派简介1.1、香橙派 AI Pro 硬件资源介绍1.2、华为昇腾310&#xff08;Ascend310&#xff09; 简介1.3、 昇腾310AI能力和CANN 简介昇腾310 NPU简介 二、远程环境配置2.1、ssh2.2、vnc…

springboot管理的各依赖版本查看

找一个springboot相关的依赖&#xff0c;比如这里我找mybatis 鼠标点击artifactId名称&#xff0c;图中蓝色字段&#xff0c;跳转到springboot依赖&#xff08;鼠标悬停在上面变成蓝色表示可点击跳转&#xff09;&#xff0c; 点击spring-boot-dependencites&#xff0c;跳转到…

list(二)和_stack_queue

嗨喽大家好&#xff0c;时隔许久阿鑫又给大家带来了新的博客&#xff0c;list的模拟实现&#xff08;二&#xff09;以及_stack_queue&#xff0c;下面让我们开始今天的学习吧&#xff01; list(二)和_stack_queue 1.list的构造函数 2.设计模式之适配器和迭代器 3.新容器de…

产品人生(9):从“波士顿矩阵”看“个人职业规划”

波士顿矩阵&#xff08;简称BCG矩阵&#xff09;是一种战略规划工具&#xff0c;由波士顿咨询公司的创始人布鲁斯亨德森&#xff08;Bruce Henderson&#xff09;于1970年代初提出的&#xff0c;它以两个关键指标作为分析维度&#xff1a;市场增长率和相对市场份额&#xff0c;…

k8s牛客面经篇

k8s的pod版块: k8s的网络版块: k8s的deployment版块: k8s的service版块: k8s的探针板块: k8s的控制调度板块: k8s的日志监控板块: k8s的流量转发板块: k8s的宏观版块:

【InternLM实战营第二期笔记】04:XTuner 微调 LLM:1.8B、多模态、Agent

文章目录 笔记微调基础知识Xtuner8G显存微调模型InternLM2 1.8B多模态实践环节数据微调过拟合WebUI 交互 多模态微调 作业 这回学乖了&#xff0c;打开本节课第一件事先不看教程而是装环境~ 笔记 微调基础知识 这里感慨一下&#xff0c;垂直领域的训练还是挺困难的&#xff0c;…

docker安装redis以及持久化

为了避免当虚拟机关机后redis数据丢失的情况&#xff0c;redis需要持久化。所以要挂载数据卷 创建数据和配置存放的目录 [root192 data]# pwd /root/data [root192 data]# mkdir -p /root/data/redis/conf && chmod 777 /root/data/redis/conf [root192 data]# mkdir …

php反序列化中的pop链

目录 一、什么是POP 二、成员属性赋值对象 例题&#xff1a; 方法一 方法二 三、魔术方法的触发规则 例题&#xff1a; 四、POC的编写 例题1&#xff1a; 例题2 [NISACTF 2022]babyserialize 今日总结&#xff1a; 一、什么是POP 在反序列化中&#xff0c;我们…

项目资源管理

目录 1.概述 2.六个过程 2.1. 规划资源管理 2.2. 估算活动资源 2.3. 获取资源 2.4. 建设团队 2.5. 管理团队 2.6. 控制资源 3.应用场景 3.1.十个应用场景 3.2.软件开发项目 3.2.1. 资源规划 3.2.2. 资源分配 3.2.3. 资源获取 3.2.4. 资源优化 3.2.5. 资源监控与…