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

GDPU 数据结构 天码行空14

实验十四 查找算法的实现

一、【实验目的】

1、掌握顺序排序,二叉排序树的基本概念

2、掌握顺序排序,二叉排序树的基本算法(查找算法、插入算法、删除算法)

3、理解并掌握二叉排序数查找的平均查找长度。

二、【实验内容】

1、已知如下11个元素的有序表:
{ 5, 13, 19, 21, 37, 56, 64, 75, 80, 88, 92 }

请设计完成二分查找法查找关键字为64的数据元素的程序。

2、已知一个个数为12的数据元素序列为 { “Dec”, “Feb”, “Nov”, “Oct”, “June”, “Sept”, “Aug”, “Apr”, “May”, “July”, “Jan”, “Mar” },
要求:

(1)按各数据元素的顺序(字母大小顺序)构造一棵二叉排序数,并中序打印排序结果。

(2)查找数据”Sept”是否存在。

三、【实验源代码】

📕 CPP版

#include <iostream>
#include <string>
using namespace std;class Node   // 定义二叉树节点
{
public:string data;    // 存储节点的数据Node* left;     // 指向左子节点Node* right;    // 指向右子节点Node(string data)   // 构造函数{this->data = data;  // 初始化数据this->left = nullptr;   // 左子节点指向空this->right = nullptr;  // 右子节点指向空}
};// 在长度为 n 的 a 数组中找 x,找到返回下标,找不到返回 -1
int binarySearch(int a[], int x, int n)
{int l = 0;  // 左端点int r = n - 1;  // 右端点while (l < r)  // 当左端点小于右端点时循环{int mid = (l + r) >> 1; // 取中间点(右移一位相当于除以2)if (x > a[mid]) // 如果要查找的数在中间点的右边l = mid + 1;    // 左端点移到中间点的右侧elser = mid;    // 右端点移到中间点或中间点的左侧}if (a[l] == x) // 如果查到了要找的数return l;   // 返回下标cout << "没找到!!" << x << endl;   // 否则输出没找到的消息return -1;  // 返回-1
}void insert(Node* root, string s)    // 向二叉搜索树中插入一个节点
{if (root == nullptr)    // 如果根节点为空{root = new Node(s); // 创建一个新节点作为根节点return;}Node* t = root; // 定义指针t指向根节点while (t != nullptr)    // 循环直到找到合适的位置插入新节点{int com = s.compare(t->data);   // 比较节点的数据与要插入的数据的大小关系if (com == 0)   // 如果相等,说明已经存在该节点return; // 直接返回else if (com > 0)   // 如果要插入的数据大于节点的数据,说明要插入右子树{if (t->right == nullptr)    // 如果右子树为空t->right = new Node(s); // 创建一个新节点作为右子节点elset = t->right;   // 否则继续向右子树查找}else if (com < 0)   // 如果要插入的数据小于节点的数据,说明要插入左子树{if (t->left == nullptr) // 如果左子树为空t->left = new Node(s);  // 创建一个新节点作为左子节点elset = t->left;    // 否则继续向左子树查找}}
}Node* initBiTree(string ss[], int n)    // 初始化二叉搜索树
{Node* root = new Node(ss[0]);   // 创建根节点for (int i = 1; i < n; i++) // 循环插入其余的节点insert(root, ss[i]);return root;    // 返回根节点
}void inOrder(Node* root)    // 中序遍历二叉搜索树
{if (root != nullptr)    // 如果节点不为空{if (root->left != nullptr)  // 如果有左子节点,先中序遍历左子树inOrder(root->left);cout << root->data << " ";  // 输出节点的数据if (root->right != nullptr) // 如果有右子节点,后中序遍历右子树inOrder(root->right);}
}void search(Node* root, string s)   // 在二叉搜索树中查找一个节点
{while (root != nullptr) // 如果节点不为空{int com = s.compare(root->data);    // 比较节点的数据与要查找的数据的大小关系if (com == 0)   // 如果相等,说明找到了{cout << "找到了" << s << endl; // 输出找到的消息return;}else if (com > 0)   // 如果要查找的数据大于节点的数据,说明要查找右子树root = root->right; // 继续向右子树查找else    // 否则要查找左子树root = root->left;  // 继续向左子树查找}cout << "没找到" << s << endl;  // 输出没找到的消息
}int main()
{int a[] = { 5, 13, 19, 21, 37, 56, 64, 75, 80, 88, 92 };   // 定义一个有序数组int x = 64; // 要查找的数int idx = binarySearch(a, x, sizeof(a) / sizeof(a[0]));   // 在数组中查找要查找的数if (idx != -1)  // 如果找到了cout << x << "在数组中的下标是" << idx << endl;   // 输出结果string ss[] = { "Dec", "Feb", "Nov", "Oct", "June", "Sept", "Aug", "Apr", "May", "July", "Jan", "Mar" };    // 定义一个字符串数组Node* root = initBiTree(ss, sizeof(ss) / sizeof(ss[0]));    // 初始化二叉搜索树cout << "中序遍历序列为:";inOrder(root);  // 中序遍历二叉搜索树cout << endl;string s = "Sept"; // 要查找的字符串search(root, s);   // 在二叉搜索树中查找节点return 0;
}

📕 java版

class Main
{static class Node{String data;Node left;Node right;Node(String data){this.data = data;}}// 在长度为 n 的 a 数组中找 x,找到返回下标,找不到返回 -1static int binarySearch(int[] a, int x, int n){int l = 0;int r = n - 1;while (l < r){int mid = (l + r) >> 1;if (x > a[mid]) // x在 mid 的右边l = mid + 1;elser = mid;}if (a[l] == x)return l;System.out.println("没找到!!" + x);return -1;}static void insert(Node root, String s){if (root == null){root = new Node(s);return;}Node t = root;while (t != null){int com = s.compareTo(t.data);if (com == 0)return;else if (com > 0)// 右子树{if (t.right == null)t.right = new Node(s);elset = t.right;} else if (com < 0){if (t.left == null)t.left = new Node(s);elset = t.left;}}}static Node initBiTree(String[] ss, int n){Node root = new Node(ss[0]);for (int i = 1; i < n; i++)insert(root, ss[i]);return root;}static void inOrder(Node root){if (root != null){if (root.left != null)inOrder(root.left);System.out.print(root.data + " ");if (root.right != null)inOrder(root.right);}}public static void main(String[] args){int[] a = { 5, 13, 19, 21, 37, 56, 64, 75, 80, 88, 92 };int x = 64;int idx = binarySearch(a, x, a.length);if (idx != -1)System.out.println(x + "在数组中的下标是" + idx);String[] ss = { "Dec", "Feb", "Nov", "Oct", "June", "Sept", "Aug", "Apr", "May", "July", "Jan", "Mar" };Node root = initBiTree(ss, ss.length);inOrder(root);System.out.println();String s = "Sept";boolean search = search(root, s);if (search)System.out.println("找到了" + s);else{System.out.println("没找到" + s);}}private static boolean search(Node root, String s){while (root != null){int com = s.compareTo(root.data);if (com == 0)return true;else if (com > 0)root = root.right;else{root = root.left;}}return false;}
}

四、【实验结果】

64在数组中的下标是6
中序遍历序列为:Apr Aug Dec Feb Jan July June Mar May Nov Oct Sept 
找到了Sept

五、【实验总结】
在这里插入图片描述

相关文章:

GDPU 数据结构 天码行空14

实验十四 查找算法的实现 一、【实验目的】 1、掌握顺序排序&#xff0c;二叉排序树的基本概念 2、掌握顺序排序&#xff0c;二叉排序树的基本算法&#xff08;查找算法、插入算法、删除算法&#xff09; 3、理解并掌握二叉排序数查找的平均查找长度。 二、【实验内容】 …...

科技提升安全,基于YOLOv5系列模型【n/s/m/l/x】开发构建商超扶梯场景下行人安全行为姿态检测识别系统

在商超等人流量较为密集的场景下经常会报道出现一些行人在扶梯上摔倒、受伤等问题&#xff0c;随着AI技术的快速发展与不断普及&#xff0c;越来越多的商超、地铁等场景开始加装专用的安全检测预警系统&#xff0c;核心工作原理即使AI模型与摄像头图像视频流的实时计算&#xf…...

【网络安全】网络防护之旅 - 对称密码加密算法的实现

&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《网络安全之道 | 数字征程》⏰墨香寄清辞&#xff1a;千里传信如电光&#xff0c;密码奥妙似仙方。 挑战黑暗剑拔弩张&#xff0c;网络战场誓守长。 目录 &#x1f608;1. 初识网络安…...

鸿蒙arkTs Toast抽取 及使用

Toast抽取&#xff0c;创建一个Utils import promptAction from ohos.promptAction; import display from ohos.display; export function ToastUtils(msg:string){try {promptAction.showToast({message: msg,duration: 1500,bottom:450});} catch (error) {console.error(sh…...

网络安全渗透测试的相关理论和工具

网络安全 一、引言二、网络安全渗透测试的概念1、黑盒测试2、白盒测试3、灰盒测试 三、网络安全渗透测试的执行标准1、前期与客户的交流阶段1.1 渗透测试的目标网络1.2 进行渗透测试所使用的方法1.3 进行渗透测试所需要的条件1.4 渗透测试过程中的限制条件1.5 渗透测试的工期1.…...

C 语言 xml 库的使用

在C语言中&#xff0c;可以使用多种库来处理XML文件&#xff0c;其中最常用的是libxml2库。libxml2是一个用于解析XML和HTML文档的C语言库&#xff0c;它提供了许多功能&#xff0c;包括解析XML文档、创建XML文档、验证XML文档等等。下面是一个简单的示例&#xff0c;演示读取l…...

群晖(Synology)云备份的方案是什么

群晖云备份方案就是在本地的 NAS 如果出现问题&#xff0c;或者必须需要重做整列的时候&#xff0c;保证数据不丢失。 当然&#xff0c;这些是针对有价值的数据&#xff0c;如果只是电影或者不是自己的拍摄素材文件&#xff0c;其实可以不使用云备份方案&#xff0c;因为毕竟云…...

Flask 中的跨域难题:定义、影响与解决方案深度解析

跨域&#xff08;Cross-Origin&#xff09;是指在浏览器中&#xff0c;一个页面的脚本试图访问另一个页面的内容时发生的安全限制。Flask 作为一种 Web 应用框架&#xff0c;也涉及到跨域问题。本文将详细介绍跨域的定义、影响以及解决方案&#xff0c;涵盖如何在 Flask 中处理…...

汽车IVI中控开发入门及进阶(十二):V4L2视频

前言 汽车中控也被称为车机、车载多媒体、车载娱乐等,其中音频视频是非常重要的部分,比如播放各种格式的音乐文件、播放蓝牙接口的音乐、播放U盘或TF卡中的音视频文件,看起来很简单。如果说音频来源于振动,那么图片图像就是光反射的一种表象。模拟信号表示在空间上是连续…...

gitlab下载安装

1.下载 官网rpm包 gitlab/gitlab-ce - Results in gitlab/gitlab-ce 国内镜像 Index of /gitlab-ce/yum/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2.安装 rpm -ivh gitlab-ce-16.4.3-ce.0.el7.x86_64.rpm 3.配置 vim /etc/gitlab/gitlab.rb 将 externa…...

Jmeter,提取响应体中的数据:正则表达式、Json提取器

一、正则表达式 1、线程组--创建线程组&#xff1b; 2、线程组--添加--取样器--HTTP请求&#xff1b; 3、Http请求--添加--后置处理器--正则表达式提取器&#xff1b; 4、线程组--添加--监听器--查看结果树&#xff1b; 5、线程组--添加--取样器--调试取样器。 响应体数据…...

【SpringBoot篇】基于布隆过滤器,缓存空值,解决缓存穿透问题 (商铺查询时可用)

文章目录 &#x1f354;什么是缓存穿透&#x1f384;解决办法⭐缓存空值处理&#x1f388;优点&#x1f388;缺点&#x1f38d;代码实现 ⭐布隆过滤器&#x1f38d;代码实现 &#x1f354;什么是缓存穿透 缓存穿透是指在使用缓存机制时&#xff0c;大量的请求无法从缓存中获取…...

Gitlab基础篇: Gitlab docker 安装部署、Gitlab 设置账号密码

文章目录 1、环境准备2、配置1)、初始化2)、修改gitlab配置文件3)、修改docker配置的gitlab默认端口 gitlab进阶配置gitlab 设置账号密码 1、环境准备 安装docker gitlab前确保docker环境&#xff0c;如果没有搭建docker请查阅“Linux docker 安装文档” docker 下载 gitlab容…...

c++常见函数处理

1、clamp clamp&#xff1a;区间限定函数 int64_t a Clamp(a, MIN_VALUE, MAX_VALUE); #include <iomanip> #include <iostream> #include <sstream>int main() {std::cout << "no setw: [" << 42 << "]\n"<&l…...

MYsql第二次作业

目录 问题 解答 1.显示所有职工的基本信息。 2.查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 3.求出所有职工的人数。 4.列出最高工和最低工资。 5.列出职工的平均工资和总工资。 6.创建一个只有职工号、姓名和参加工作的新表&#xff0c;名为工作日…...

SQLAlchemy 第三篇

使用insert语句 from sqlalchemy import Table, Column, Integer, String, MetaDatametadata_obj MetaData() user_table Table("user_account",metadata_obj,Column("id", Integer, primary_keyTrue),Column("name", String(255)),Column(&q…...

交互过程中影响信息质量好坏的因素

人机交互是指人与计算机之间的交流和互动&#xff0c;而人人交流是指人与人之间的交流和互动。在信息质量方面&#xff0c;人机交互通常更为准确和精确&#xff0c;而人人交流可能存在误解、模糊和歧义。 人机交互的信息传递往往通过明确的界面、符号和指令等方式进行。计算机可…...

服务器上配置jupyter,提示Invalid credentials如何解决

我是按照网上教程在服务器上安装的jupyter以及进行的密码配置&#xff0c;我利用 passwd()这个口令生成的转译密码是"argon...."。按照教程配置jupyter notebook配置文件里面的内容&#xff0c;登陆网页提示"Invalid credentials"。我谷歌得到的解答是&…...

Axure中动态面板使用及轮播图多种登录方式左侧导航栏之案列

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、轮播图简介 1、什么是轮播图 2、轮播图有什么作用 3、轮播图有什么特点 4、轮播图适应范围 5、…...

大数据之旅-问题反思

1.谈谈你对MR执行流程各个阶段的理解&#xff08;提示里面涉及到排序&#xff0c;快速排序或者归并排序知道两种实现形式&#xff09;&#xff1f; 2.hadoop 1.0和hadoop 2.0明显的差异如何理解&#xff1f; hadoop2.0与hadoop1.0区别体现在在架构、性能、功能和组件方面&…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

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 …...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...