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

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

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

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

相关文章

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

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

Ubuntu如何安装KVM

环境&#xff1a; 联想E14笔记本 Ubuntu20.04 问题描述&#xff1a; Ubuntu如何安装KVM 解决方案&#xff1a; 1.验证CPU是否支持硬件虚拟化 rootst-ThinkPad-E14:~# grep -Eoc (vmx|svm) /proc/cpuinfo 162.检查 VT 是否在 BIOS 中启用 安装 apt install cpu-checker …

PHP中的依赖注入是怎样的?

依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;是一种设计模式&#xff0c;它用于解耦组件之间的依赖关系&#xff0c;提高代码的可维护性、可测试性和灵活性。在 PHP 中&#xff0c;依赖注入通常通过构造函数注入、方法注入或属性注入来实现。 以下是依…

微服务组件Sentinel的学习(1)

Sentinel学习笔记&#xff08;1&#xff09; Sentinel基本概念Sentinel功能和设计理念流量控制熔断降级系统负载保护 Sentinel基本概念 资源 资源是Sentinel的关键概念。它可以是 ava应用程序中的任何内容&#xff0c;例如&#xff0c;由应用程序提供的服务&#xff0c;或由应…

stm32F407-GPIO的使用——点亮LED并且讲解各个寄存器

stm32F407-GPIO的使用——点亮LED并且讲解各个寄存器 本文为stm32GPIO的介绍与使用&#xff0c;例子是简单的LED点亮。 一、 GPIO GPIO&#xff08;General Purpose I/O Ports&#xff09;意思为通用输入/输出端口&#xff0c;通俗地说&#xff0c; 就是一些引脚&#xff0c;可…

Elasticsearch 8.10之前同义词最佳实践

1、同义词在搜索引擎领域用途 同义词在搜索引擎领域的用途可概括如下: 增强搜索的准确性——当用户输入一个关键词时,可能与他们实际意图相关的文档使用了一个不同的关键词或短语。同义词允许搜索引擎理解和识别这些情况,返回更准确的结果。如:“遥遥领先”和“华为Meta60…

QT学习(20):QTcpSocket和QAbstractSocket

目录 QAbstractSocket建立连接的函数和信号阻塞功能QTcpSocket QAbstractSocketPrivateQAbstractSocketEngine和QNativeSocketEngine QAbstractSocket QAbstractSocket 是QTcpSocket和QUdpSocket的基类&#xff0c;并且包含这两个类的所有通用功能。如果需要套接字&#xff0c…

WT588F02B-8S语音芯片:灵活应用的语音播放利器,实现多重优势

在智能语音交互领域&#xff0c;唯创知音WT588F02B-8S可重复擦写&#xff08;Flash型&#xff09;语音芯片声音播放提示IC凭借其出色的特性&#xff0c;为用户提供了更灵活、高效的语音解决方案。本文将聚焦于该芯片的应用优势&#xff0c;包括实现用户自主更新语音文件、节约打…

WTN6xxx系列OTP语音芯片:智能语音解决方案的可靠之选

在智能语音交互领域&#xff0c;唯创知音的WTN6xxx系列OTP语音芯片以其独特的特性成为声音播放提示IC的可靠之选。本文将深入探讨WTN6xxx系列OTP语音芯片的应用优势&#xff0c;展示其在各个方面的卓越性能。 一、低成本、高性能 1.经济实惠&#xff1a; WTN6xxx系列OTP语音芯…

AGI魔盒,会放出冥王PLUTO还是阿童木?

人机共生&#xff0c;是科幻作品永恒的主题。其中&#xff0c;《冥王PLUTO》可能是最早探讨人类与机器人如何在冲突中共存的漫画作品。 如果说阿童木是人机共生的“和平使者”&#xff0c;启蒙了几代人对机器人的信任和热爱,那么冥王PLUTO就是阿童木的反面&#xff0c;一个心怀…

基于ssm网络安全宣传网站设计论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本网络安全宣传网站就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

2023-12-14 使用Qt画一条曲线(AI辅助)

点击 <C 语言编程核心突破> 快速C语言入门 使用Qt画一条曲线 前言一、Qchart简介二、代码总结 前言 要解决问题: 有一个函数, 生成一些点, 想画一条曲线. 想到的思路: 这个用Qchart比较简单. 其它的补充: 需要稍许配置 一、Qchart简介 QChart是Qt中的一个图表控件&a…

记录 | mac打开终端时报错:login: /opt/homebrew/bin/zsh: No such file or directory [进程已完成]

mac打开终端时报错&#xff1a;login: /opt/homebrew/bin/zsh: No such file or directory [进程已完成]&#xff0c;导致终端没有办法使用的情况 说明 zsh 没有安装或者是安装路径不对 可以看看 /bin 下有没有 zsh&#xff0c;若没有&#xff0c;肯定是有 bash 那就把终端默…

三层交换机原理与配置

文章目录 三层交换机原理与配置一、三层交换技术概述二、传统的 MLS三、基于CEF 的MLS1、转发信息库&#xff08;FIB&#xff09;2、邻接关系表3、工作原理&#xff1a; 四、三层交换机的配置1、三层交换机配置命令2、三层交换机配置步骤 三层交换机原理与配置 一、三层交换技…

【Hadoop】

Hadoop是一个开源的分布式离线数据处理框架&#xff0c;底层是用Java语言编写的&#xff0c;包含了HDFS、MapReduce、Yarn三大部分。 组件配置文件启动进程备注Hadoop HDFS需修改需启动 NameNode(NN)作为主节点 DataNode(DN)作为从节点 SecondaryNameNode(SNN)主节点辅助分…

如何学习Kubernetes,学习K8S入门教程

学习 Kubernetes&#xff08;K8s&#xff09;确实不容易 你的硬件资源有限时&#xff0c;不过别担心&#xff0c;我帮你理清思路&#xff0c;让你在学习 K8s 的路上更加从容。 1、资源限制下的学习方法 当硬件资源有限时&#xff0c;一个好的选择是使用云服务提供的免费层或者…

✺ch2——OpenGL图像管线

目录 基于C图形应用&#xff06;管线概览OpenGL类型第一个C/OpenGL应用程序◍API (1) GLSL类型着色器——画一个点的程序◍API (2)◍API (3) 栅格化像素操作——Z-buffer算法检测 OpenGL 和 GLSL 错误◍API (4) 从顶点来构建一个三角形场景动画◍API (5) OpenGL某些方面的数值—…

C语言第四十九弹----模拟使用strcpy函数

使用C语言模拟使用strcpy函数 定义&#xff1a;strcpy 函数是 C 标准库中用于字符串复制的函数。它接受两个参数&#xff0c;第一个参数 dest 是目标字符串的指针&#xff0c;第二个参数 src 是源字符串的指针&#xff0c;函数的功能是将源字符串复制到目标字符串中&#xff0…

音频筑基:总谐波失真THD+N指标

音频筑基&#xff1a;总谐波失真THDN指标 THDN含义深入理解 在分析音频信号中&#xff0c;THDN指标是我们经常遇到的概念&#xff0c;这里谈谈自己的理解。 THDN含义 首先&#xff0c;理解THD的定义&#xff1a; THD&#xff0c;Total Harmonic Distortion&#xff0c;总谐波…

C语言—每日选择题—Day48

第一题 1. 已知宏定义&#xff1a; #define M y*y3*y &#xff0c; 则表达式 s3*M4*My*M 预处理阶段后的结果是 A&#xff1a;s3*(y*y3*y)4*(y*y3*y)y*(y*y3*y) B&#xff1a;s3*(y*y)3*y4*(y*y)3*yy*(y*y)3*y C&#xff1a;s3*y*y3*y4*y*y3*yy*y*y3*y D&#xff1a;s3*(y*y)(3…