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

40.查找练习题(王道2023数据结构第7章)

试题1(王道7.2.4节综合练习5):

写出折半查找的递归算法。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>#define MAXSIZE 10
#define ElemType int
#define Status inttypedef struct{int data[MAXSIZE];  //存储空间的基地址int length;  //当前长度 
}SqList;void CreatList(SqList &L){  //建立线性表L.length = 6;L.data[0] = 2;L.data[1] = 3;L.data[2] = 5;L.data[3] = 7;L.data[4] = 9;L.data[5] = 11;
}int BinarySearch(SqList L,ElemType x,int low,int high){int mid = (low + high) / 2;if(low > high)return -1;else if(L.data[mid] == x)return mid;else if(L.data[mid] < x)BinarySearch(L, x, mid + 1, high);elseBinarySearch(L, x, low, mid - 1);
}int main(){SqList L;CreatList(L);printf("%d", BinarySearch(L, 7, 0, 5));
}

输出:

3

试题2(王道7.2.4节综合练习6):

线性表中各结点检索概率不等时,可用如下策略提高顺序检索的效率:若找到指定的结点,则将该结点与前驱结点(若存在)交换,使得经常被检索的结点尽量位于表的前端。试设计在顺序结构和链式结构的线性表上实现上述策略的顺序检索算法。

此题可以联系链表练习题的第20题:

【试题再现】试题20:设头指针为L的带有表头结点的非循环双向链表,其每个结点中除有prior(前驱指针),data(数据),next(后继指针)域外,还有一个访问频度域freq。在链表被启用前,其值均初始化为零。每当在连表中进行一次Locate(L,x)运算时,令元素值为x的结点中freq域的值增1,并使此链表中结点保持按访问频度非递增的顺序排列,同时最近访问的结点排在频度相同的结点的前面,以便使频繁访问的结点总是靠近表头。试编写符合上述要求的Locate(L,x)运算的算法,该运算为函数过程,返回找到结点的地址,类型为指针型。

31.链表练习题(2)(王道2023数据结构2.3.7节16-25题)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_54708219/article/details/133151369顺序表实现:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>#define MAXSIZE 10
#define ElemType int
#define Status inttypedef struct{int data[MAXSIZE];  //存储空间的基地址int length;  //当前长度 
}SqList;void CreatList(SqList &L){  //建立线性表L.length = 6;L.data[0] = 2;L.data[1] = 3;L.data[2] = 5;L.data[3] = 7;L.data[4] = 9;L.data[5] = 11;
}void PrintList(SqList L){for (int i = 0; i < L.length;i++){printf("%d ", L.data[i]);}
}int Search(SqList &L,ElemType x){int t;for (int i = 0; i < L.length;i++){if(L.data[i] == x){t = L.data[i - 1];  //交换L.data[i - 1] = x;L.data[i] = t;return i;}	}return -1;
}int main(){SqList L;CreatList(L);PrintList(L);printf("\n");printf("%d\n", Search(L, 7));PrintList(L);
}

输出:

2 3 5 7 9 11 
3
2 3 7 5 9 11

链表实现:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>#define MAXSIZE 10
#define ElemType int
#define Status int//单链表的数据结构
typedef struct LNode
{ElemType data;struct LNode *next;
}LNode, *LinkList;//初始化
int InitList(LinkList &L)
{L = (LNode *)malloc(sizeof(LNode));L->next = NULL;return 1;
}//输出
void PrintList(LinkList L)
{printf("当前单链表的所有元素:");LNode *p;p = L->next;while (p != NULL){printf("[%d] ", p->data);p = p->next;}printf("\n");
}int Create(LinkList &L)
{int n, e;LNode *temp = L;//声明一个指针指向头结点,用于遍历链表   printf("请输入要输入元素的个数:");scanf("%d", &n);for (int i = 1; i <= n; i++){LNode *a = (LNode*)malloc(sizeof(LNode));printf("请输入第%d元素的值:", (i));scanf("%d", &e);a->data = e;temp->next = a;a->next = NULL;temp = temp->next;}return 1;
}int Search(LinkList L,ElemType x){LinkList p = L;LinkList q = L;LinkList r;int i = 0;while(p!=NULL){if(p->data != x){p = p->next;i = i + 1;}else{if(i > 1){for (int j = 1; j <= i - 2; j++){q = q->next;}  //q指向第i-2个元素r = q->next;  //r指向第i-1个元素q->next = p;q = p->next;  //q指向第i+1个元素p->next = r;r->next = q;}return i;}}return -1;
}int main(){LinkList L;InitList(L);Create(L);PrintList(L);printf("元素在链表第%d个位置\n", Search(L, 7));PrintList(L);
}

输出:

请输入要输入元素的个数:6
请输入第1元素的值:2
请输入第2元素的值:3
请输入第3元素的值:5
请输入第4元素的值:7
请输入第5元素的值:9
请输入第6元素的值:11
当前单链表的所有元素:[2] [3] [5] [7] [9] [11]
元素在链表第4个位置
当前单链表的所有元素:[2] [3] [7] [5] [9] [11]

试题3(王道7.3.4节综合练习6):

设计算法,判断给定的二叉树是否是二叉排序树。

看其中序遍历序列是否是递增有序的即可:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>#define MAXSIZE 10
#define ElemType int//二叉排序树的结构体定义
typedef struct BiTNode{ElemType data;  //数据域BiTNode *lchild;  //指向左子树根节点的指针BiTNode *rchild;  //指向右子树根节点的指针
}BiTNode, *BiTree;int BST_Insert(BiTree &T,ElemType k){  //构造一棵二叉排序树if(T==NULL){T = (BiTree)malloc(sizeof(BiTNode));T->data = k;T->lchild = NULL;T->rchild = NULL;return 1;}else if(k==T->data){return 0;}else if(k<T->data){return BST_Insert(T->lchild, k);}else{return BST_Insert(T->rchild, k);}
}int if_BST(BiTree T){int a[10];int i = 0;if (T!=NULL){if_BST(T->lchild);a[i] = T->data;i = i + 1;if_BST(T->rchild);}for (int j = 1; j <= i-1;j++){  //实际上a数组中元素是0到i-1if(a[j-1] >= a[j]){return 0;}}return 1;
}int main(){BiTree T=NULL;int a[5] = {4, 2, 1, 3, 5};  //以王道第10题做验证for (int i = 0; i <= 4;i++){BST_Insert(T, a[i]);}printf("%d",if_BST(T));return 0;
}

输出:

1

试题4(王道7.3.4节综合练习7):

设计算法求指定结点在给定二叉排序树的层次。

老问题了,直接上递归:

int levelofNode(BiTree T, ElemType x,int level){if(T==NULL)return -1;else{if(T->data==x)return level;else{if(T->data<x)return levelofNode(T->rchild, x, level + 1);elsereturn levelofNode(T->lchild, x, level + 1);}}
}int main(){BiTree T=NULL;int a[5] = {4, 2, 1, 3, 5};  //以王道第10题做验证for (int i = 0; i <= 4;i++){BST_Insert(T, a[i]);}printf("%d",levelofNode(T,3,1));return 0;
}

输出:

3

试题5(王道7.3.4节综合练习8):

利用二叉树的遍历思想编写一个判断二叉树是否是平衡二叉树的算法。

这里利用层次遍历每一个结点,检查平衡因子绝对值是否小于1。全部通过才返回True。

int Depth(BiTree T){if(T==NULL)return 0;else{return (Depth(T->lchild) >= Depth(T->rchild)) ? Depth(T->lchild) + 1 : Depth(T->rchild) + 1;}
}int abs(int x){return x >= 0 ? x : -x;
}bool ifBalanceTree(BiTree T){  //层次遍历每一个结点int balance = 0;Queue q;InitQueue(q);BiTree p = T;InsertQueue(q, p);while(!IsQueueEmpty(q)){p = DeleteQueue(q, p);balance = abs(Depth(p->lchild) - Depth(p->rchild));if(balance > 1)return false;if(p->lchild!=NULL)InsertQueue(q, p->lchild);if(p->rchild!=NULL)InsertQueue(q, p->rchild);}return true;
}int main(){BiTree T=NULL;int a[5] = {1, 2, 3, 4, 5};  //以王道第10题做验证for (int i = 0; i <= 4;i++){BST_Insert(T, a[i]);}printf("%d",ifBalanceTree(T));return 0;
}

输出:

1  //int a[5] = {4, 2, 1, 3, 5};
0  //int a[5] = {1, 2, 3, 4, 5};

试题6(王道7.3.4节综合练习9):

设计算法求给定二叉排序树最小和最大的关键字。

最小关键字在最左下,最大关键字在最右下,抓住这一点判断即可。此题不需要从头遍历把所有结点全部输出。

int maxvalue(BiTree T){  //求最大关键字BiTree p=T;while (p->rchild!=NULL){p = p->rchild;}return p->data;
}int main(){BiTree T=NULL;int a[5] = {4, 2, 1, 3, 5};  //以王道第10题做验证for (int i = 0; i <= 4;i++){BST_Insert(T, a[i]);}printf("%d",maxvalue(T));return 0;
}
int minvalue(BiTree T){  //求最小关键字BiTree p=T;while (p->lchild!=NULL){p = p->lchild;}return p->data;
}int main(){BiTree T=NULL;int a[5] = {4, 2, 1, 3, 5};  //以王道第10题做验证for (int i = 0; i <= 4;i++){BST_Insert(T, a[i]);}printf("%d",minvalue(T));return 0;
}

试题7(王道7.3.4节综合练习10):

设计一个算法,从大到小输出二叉排序树中所有值不小于k的关键字。

倒序访问:显然先访问右子树,然后根结点,最后左子树,然后检查并输出。

void printoverk(BiTree T,int k){  //求最小关键字if(T!=NULL){printoverk(T->rchild, k);if(T->data>k){printf("%d ", T->data);}printoverk(T->lchild, k);}
}int main(){BiTree T=NULL;int a[5] = {4, 2, 1, 3, 5};  //以王道第10题做验证for (int i = 0; i <= 4;i++){BST_Insert(T, a[i]);}printoverk(T, 2);return 0;
}

输出:

5 4 3

试题8(王道7.3.4节综合练习11):

编写一个递归算法,在一棵具有n个结点的二叉排序树上查找第k小的元素,并返回该结点的指针。要求算法的平均时间复杂度是O(log_2n),二叉排序树每个结点中除了data,lchild,rchild外,增设一个count成员,保存以该结点为根的子树的结点个数。

函数的参数有两个:二叉树指针T和查找第k个最小元素。

//求树的结点数(递归)
int Number_Node(BiTree T){if(T==NULL)return 0;else{return Number_Node(T->lchild) + Number_Node(T->rchild) + 1;}
}int BST_Insert(BiTree &T,ElemType k){  //构造一棵二叉排序树if(T==NULL){T = (BiTree)malloc(sizeof(BiTNode));T->data = k;T->lchild = NULL;T->rchild = NULL;return 1;}else if(k==T->data){return 0;}else if(k<T->data){return BST_Insert(T->lchild, k);}else{return BST_Insert(T->rchild, k);}
}void BST_Insertcount(BiTree &T){  //修改count的数值Queue q;InitQueue(q);BiTree p = T;InsertQueue(q, p);while(!IsQueueEmpty(q)){p = DeleteQueue(q, p);p->count = Number_Node(p);if(p->lchild!=NULL)InsertQueue(q, p->lchild);if(p->rchild!=NULL)InsertQueue(q, p->rchild);}
}BiTree SearchSmallk(BiTree T,int k){  //寻找第k小的元素if(k<1||k>T->count)  //k不合法,直接返回空return NULL;if(T->lchild == NULL){if(k == 1)return T;elsereturn SearchSmallk(T->rchild, k - 1);  //第k小的元素必在右子树}else{if(T->lchild->count == k-1)return T;else if(T->lchild->count < k-1)return SearchSmallk(T->rchild, k - T->lchild->count - 1);  //第k小的元素必在右子树elsereturn SearchSmallk(T->lchild, k);  //第k小的元素必在左子树}
}int main(){BiTree T=NULL;BiTree p;int a[5] = {4, 2, 1, 3, 5};  //以王道第10题做验证for (int i = 0; i <= 4;i++){BST_Insert(T, a[i]);}BST_Insertcount(T);p = SearchSmallk(T, 3);printf("%d", p->data);return 0;
}

输出:

3

相关文章:

40.查找练习题(王道2023数据结构第7章)

试题1&#xff08;王道7.2.4节综合练习5&#xff09;&#xff1a; 写出折半查找的递归算法。 #include<stdio.h> #include<stdlib.h> #include<string.h>#define MAXSIZE 10 #define ElemType int #define Status inttypedef struct{int data[MAXSIZE]; /…...

Segmentation fault 的bug解决

一&#xff0c;Segmentation fault 的bug解决 问题描述&#xff1a;自己在使用CPU上调试完代码之后&#xff0c;可以稳定运行&#xff0c;有输出结果。 但是把数据和模型加载上GPU之后&#xff0c;出现了报错。 Segmentation fault (core dumped) 搜了一下可能存在的原因&…...

【Python机器学习】零基础掌握BaggingRegressor集成学习

如何提升回归模型的稳定性和准确性? 在实际生活中,比如房价预测,经常会遇到一种情况:有大量的特征和样本数据,但模型的预测准确度仍然不尽人意。这时候,单一的模型(如支持向量机回归)可能表现得并不够好。 考虑到这个问题,解决方案可能是使用集成方法,特别是Baggin…...

麒麟KYLINOS通过命令行配置kysec的防火墙

原文链接&#xff1a;麒麟KYLINOS通过命令行配置kysec的防火墙 hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇使用命令行配置kysec的防火墙的文章&#xff0c;通过本篇文章的学习&#xff0c;大家可以了解到图形化界面中的防火墙信息是如何生成的&#xff0c;为后期…...

磁盘监控:告警时发送邮件

1.配置邮箱 1.编辑邮箱配置文件 vim /etc/mail.rc2.在末尾输入自己的邮箱配置&#xff0c;以163邮箱为例 #开启ssl set ssl-verifyignore #证书目录&#xff0c;下方为centos系统证书默认位置&#xff0c;也自行生成证书并指定 set nss-config-dir/etc/pki/nssdb # 配置的第…...

【HarmonyOS】元服务卡片router实现跳转到指定页面并传动态参数

【关键字】 元服务卡片、router跳转不同页面、传递动态参数 【写在前面】 本篇文章主要介绍开发元服务卡片时&#xff0c;如何实现从卡片中点击事件跳转到指定的应用内页面&#xff0c;并传递参数接受参数功能。此处以JS UI开发服务卡片为例&#xff0c;JS卡片支持组件设置ac…...

Centos安装RabbitMQ,JavaSpring发送RabbitMQ延迟延时消息,JavaSpring消费RabbitMQ消息

1&#xff0c;版本说明 erlang 和 rabbitmq 版本说明 https://www.rabbitmq.com/which-erlang.html 确认需要安装的mq版本以及对应的erlang版本。 2&#xff0c;下载安装文件 RabbitMQ下载地址&#xff1a; https://packagecloud.io/rabbitmq/rabbitmq-server Erlang下载地…...

leetcode:1323. 6 和 9 组成的最大数字(python3解法)

难度&#xff1a;简单 给你一个仅由数字 6 和 9 组成的正整数 num。 你最多只能翻转一位数字&#xff0c;将 6 变成 9&#xff0c;或者把 9 变成 6 。 请返回你可以得到的最大数字。 示例 1&#xff1a; 输入&#xff1a;num 9669 输出&#xff1a;9969 解释&#xff1a; 改变…...

SpringBoot集成Redis Cluster集群(附带Linux部署Redis Cluster高可用集群)

目录 一、前言二、集成配置2.1、POM2.2、添加配置文件application.yml2.3、编写配置文件2.4、编写启动类2.5、编写测试类测试是否连接成功 一、前言 这里会使用到spring-boot-starter-data-redis包&#xff0c;spring boot 2的spring-boot-starter-data-redis中&#xff0c;默…...

LLaVA:visual instruction tuning

对近期一些MLLM(Multimodal Large Language Model)的总结 - 知乎本文将从模型结构&#xff0c;训练方法&#xff0c;训练数据&#xff0c;模型表现四个方面对近期的一些MLLM&#xff08;Multi-modal Large Language Models&#xff09;进行总结并探讨这四个方面对模型表现的影响…...

Python实现双目标定、畸变矫正、立体矫正

一&#xff0c;双目标定、畸变矫正、立体矫正的作用 双目目标定&#xff1a; 3D重建和测距&#xff1a;通过双目目标定&#xff0c;您可以确定两个摄像头之间的相对位置和朝向&#xff0c;从而能够根据视差信息计算物体的深度&#xff0c;进行三维重建和测距。姿态估计&#xf…...

showdoc 文件上传 (cnvd-2020-26585)

showdoc 文件上传 &#xff08;cnvd-2020-26585&#xff09; 描述 ShowDoc是一个非常适合IT团队的在线API文档、技术文档工具。通过showdoc&#xff0c;你可以方便地使用markdown语法来书写出美观的API文档、数据字典文档、技术文档、在线excel文档等等。 api_page存在任意文…...

Java数据类型,变量与运算符

1.字面常量 常量是在程序运行期间&#xff0c;固定不变的量称为常量。 public class HelloWorld{public static void main(String[] args){System.out.println("Hello,world");} } 在以上程序中&#xff0c;输出的Hello Word&#xff0c;其中的“Hello Word”就是…...

Linux nm命令

Linux的nm命令主要用于列出对象文件中的符号。以下是一些使用示例&#xff1a; 基本用法&#xff1a;只需运行’nm’命令&#xff0c;并将对象文件的名称作为输入传递给它。例如&#xff0c;我使用’nm’命令与’apl’elf 文件&#xff1a;nm apl。 在输出中为每个符号前面添加…...

iOS发布证书.p12文件无密码解决办法及导出带密码的新.p12文件方法

摘要&#xff1a; 本文将以iOS技术博主身份&#xff0c;分享解决使用无密码的.p12文件发布应用时遇到的问题&#xff0c;并介绍如何以带密码的方式重新导出.p12文件的方法。通过本文提供的步骤&#xff0c;开发者可以顺利完成证书的发布流程。 引言 在iOS应用发布过程中&…...

OpenCamera拍照的代码流程

按理来说&#xff0c;拍照应该是很简单的。随着功能的复杂&#xff0c;代码也是越来越多&#xff0c;流程越来越长。想看看地理位置是怎么保存的&#xff0c;于是就研究了一下OpenCamera的拍照流程。在回调时有点乱。 MainActivity clickedTakePhoto() takePicture() takePic…...

华为OD机考算法题:矩阵最大值

题目部分 题目矩阵最大值难度难题目说明给定一个仅包含 0 和 1 的 N*N 二维矩阵&#xff0c;请计算二维矩阵的最大值&#xff0c;计算规则如下&#xff1a; 1. 每行元素按下标顺序组成一个二进制数&#xff08;下标越大越排在低位&#xff09;&#xff0c;二进制数的值就是该行…...

【Javascript】函数之形参与实参

function c(a,b){return ab;}var sumc(3,4);console.log(sum);a,b为形参 3,4为实参 形参和实参是⼀⼀对应的数量可以不对应参数的类型不确定函数可以设置默认参数实参可以是字⾯量也可以是变量...

PAT 乙级1090危险品装箱

题目&#xff1a; 集装箱运输货物时&#xff0c;我们必须特别小心&#xff0c;不能把不相容的货物装在一只箱子里。比如氧化剂绝对不能跟易燃液体同箱&#xff0c;否则很容易造成爆炸。 本题给定一张不相容物品的清单&#xff0c;需要你检查每一张集装箱货品清单&#xff0c;…...

Response Header中不暴露Server(IIS)版本、ASP.NET及相关版本等信息

ASP MVC开发的Web默认情况下会在请求的回应中暴露Server、X-AspNet-Version、X-AspNetMvc-Version、X-Powered-By等相关服务端信息&#xff0c;公开这些敏感信息会存在一定的安全风险。 X-SourceFiles标头用于被IIS / IIS Express中某些调试模块理解&#xff0c;它包含到磁盘上…...

测试C#调用Vlc.DotNet组件播放视频

除了Windows Media Player组件&#xff0c;在百度上搜索到还有不少文章介绍采用Vlc.DotNet组件播放视频&#xff0c;关于Vlc.DotNet的详细介绍见参考文献1&#xff0c;本文学习Vlc.DotNet的基本用法。   VS2022中新建基于.net core的winform程序&#xff0c;在Nuget包管理器中…...

JS的事件委托(Event Delegation)

✨ 事件委托&#xff08;Event Delegation&#xff09;及其优势和缺点 &#x1f383; 什么是事件委托 事件委托是一种在JavaScript中处理事件的技术。它利用了事件的冒泡机制&#xff0c;将事件处理程序绑定到它们的共同祖先元素上&#xff0c;而不是直接绑定到每个子元素上。…...

selenium+python自动化安装驱动 碰到的问题

刚开始使用谷歌驱动&#xff0c;我的谷歌浏览器版本是最新版下载驱动地址&#xff0c;访问不了。 Chrome for Testing availability只能使用火狐驱动&#xff0c;我这里的火狐版本也是最新版119.0 查找全网找到驱动geckodriver下载地址 https://mirrors.huaweicloud.com/ge…...

laravel+vue2 element 一套项目级医院手术麻醉信息系统源码

手术麻醉临床信息系统源码&#xff0c;PHPmysqllaravelvue2 手术麻醉临床信息系统&#xff0c;采用计算机和通信技术&#xff0c;实现监护仪、麻醉机、输液泵等设备输出数据的自动采集&#xff0c;采集的数据能够如实准确地反映患者生命体征参数的变化&#xff0c;并实现信息高…...

GEE——使用MODIS GPP和LAI数据进行一元线性回归计算和R2分析

使用两种方法计算一元线性回归,一种使用GEE本身自带的函数,另一种使用自己编写代码的方式进行,对比两者结果的差异。 简介 一元线性趋势分析是指利用一元线性回归模型来分析一组数据的趋势性。在一元线性回归模型中,我们假设自变量(x)和因变量(y)之间存在一定的线性关…...

[论文阅读]Point Density-Aware Voxels for LiDAR 3D Object Detection(PDV)

PDV Point Density-Aware Voxels for LiDAR 3D Object Detection 论文网址&#xff1a;PDV 论文代码&#xff1a;PDV 简读论文 摘要 LiDAR 已成为自动驾驶中主要的 3D 目标检测传感器之一。然而&#xff0c;激光雷达的发散点模式随着距离的增加而导致采样点云不均匀&#x…...

自动化学报格式 Overleaf 在线使用 【2023最新教程】

自动化学报格式 Overleaf 在线使用 摘要 2023年10月26日19:28:17&#xff08;云南昆明&#xff09; 今天课程老师要我们期末提交一篇论文&#xff0c;以自动化学报格式提交。因此&#xff0c;去官网发现只有 latex 格式&#xff0c;下载下来发现各种格式不兼容&#xff1b;由于…...

掌握CSS动画技巧:打造引人注目的页面过渡效果!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一…...

薛定谔的猫重出江湖?法国初创公司AliceBob研发猫态量子比特

总部位于巴黎的初创公司Alice&Bob使用超导芯片的两个相反的量子态&#xff08;他们称之为“猫态量子比特”芯片&#xff09;来帮助开发量子计算的不同自旋方式。&#xff08;图片来源&#xff1a;网络&#xff09; 有的人认为&#xff0c;构建量子计算机的模块模仿了著名的…...

18亿欧元大动作,法国瞄准实现量子飞跃

Quobly 正在开发一种容错量子处理器&#xff08;图片来源&#xff1a;网络&#xff09; 2021年1月&#xff0c;马克龙总统宣布了法国国家量子计算计划&#xff0c;并将为该技术投入高达18亿欧元。 “量子战略至关重要&#xff0c;”马克龙在量子研究中心巴黎萨克雷大学宣布该…...