当前位置: 首页 > 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区别体现在在架构、性能、功能和组件方面&…...

django-stubs模型类型检查实战:告别运行时错误的终极指南

django-stubs模型类型检查实战&#xff1a;告别运行时错误的终极指南 【免费下载链接】django-stubs PEP-484 stubs for Django 项目地址: https://gitcode.com/gh_mirrors/dj/django-stubs 在Django开发中&#xff0c;模型定义是核心环节&#xff0c;但传统开发模式下&…...

书匠策AI官网www.shujiangce.com|别再熬夜抠格式了!这个AI工具让期刊论文写起来像“开外挂“

各位还在论文苦海里挣扎的宝子们&#xff0c;我是你们的论文老司机。 今天不聊选题&#xff0c;不聊开题&#xff0c;咱们来聊一个被90%的研究生忽略的神器——书匠策AIhttp://ww 官网直达&#xff1a;www.shujiangce.com里的期刊论文功能。 你是不是也经历过这种崩溃时刻&a…...

接口响应慢排查指南:从分层框架到实战优化

1. 问题定位&#xff1a;从现象到根源的排查框架接口响应慢&#xff0c;这几乎是每个后端开发者、运维工程师乃至测试同学都会遇到的“经典”问题。它不像一个明确的错误&#xff0c;会直接抛出异常或返回错误码&#xff0c;而是像一个隐形的性能瓶颈&#xff0c;悄无声息地拖慢…...

怎么判断铝合金熔炼炉价格才合理?

在选购铝合金熔炼炉时&#xff0c;价格只是一个参考。需要关注市场行情、熔炼炉厂家信誉、设备性能与售后服务等多方面因素。铝熔炼炉若性能更好&#xff0c;初期投入虽高&#xff0c;长期使用能提升产能并降低单位成本。不同类型的冶金熔炼炉各有特点&#xff0c;会影响选型与…...

Python 开发者五分钟接入 Taotoken 调用 GPT 与 Claude 模型指南

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Python 开发者五分钟接入 Taotoken 调用 GPT 与 Claude 模型指南 对于习惯使用 OpenAI 官方 Python SDK 的开发者来说&#xff0c;…...

别再手动记版本了!Xilinx FPGA两种自动记录编译时间的方法实测对比(附Tcl脚本)

Xilinx FPGA版本管理实战&#xff1a;Tcl脚本与USR_ACCESS原语深度评测 每次编译FPGA设计时手动记录版本号的时代该结束了。在快速迭代的硬件开发中&#xff0c;精确追踪每个比特流文件的生成时间对调试和版本控制至关重要。本文将深入对比两种自动化方案——Tcl脚本与USR_ACCE…...

【鸿蒙 HarmonyOS】从零到一:Node.js 环境配置与 DevEco Studio 无缝对接指南

1. 为什么需要Node.js环境&#xff1f; 如果你刚刚接触鸿蒙开发&#xff0c;可能对DevEco Studio里弹出的"Node.js not found"提示感到困惑。其实Node.js在鸿蒙生态中扮演着重要角色——它不仅是npm包管理器的运行环境&#xff0c;更是鸿蒙应用编译工具链的基础依赖。…...

从网站点击到疾病预测:泊松回归模型在5个真实业务场景下的应用拆解与避坑指南

从网站点击到疾病预测&#xff1a;泊松回归模型在5个真实业务场景下的应用拆解与避坑指南 在数据驱动的商业决策中&#xff0c;计数型数据的分析往往被忽视。想象一下&#xff1a;电商平台每天需要决定发送多少条推送通知&#xff0c;客服中心要预测每小时可能接到的投诉电话数…...

淘金币自动化脚本:5分钟完成淘宝全任务,每天节省20分钟宝贵时间

淘金币自动化脚本&#xff1a;5分钟完成淘宝全任务&#xff0c;每天节省20分钟宝贵时间 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本&#xff0c;包含蚂蚁森林收取能量&#xff0c;芭芭农场全任务&#xff0c;解放你的双手 项目地址: https://gitcode.com/gh_mirrors/t…...

从实验室到机房:把eNSP里练熟的Telnet AAA配置,无缝迁移到真实华为交换机上

从模拟到实战&#xff1a;华为交换机Telnet AAA配置的迁移指南 当你在eNSP模拟器中反复练习Telnet AAA配置&#xff0c;看着那些绿色指示灯亮起时&#xff0c;是否曾想过&#xff1a;"这些命令在真实设备上真的完全一样吗&#xff1f;"作为一位从实验室走向机房的网络…...