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

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

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

相关文章

GD32_定时器输入捕获波形频率

GD32_定时器输入捕获波形频率&#xff08;多通道轮询&#xff09; 之前项目上用到一个使用定时器捕获输入采集风扇波形频率得到风扇转速的模块&#xff0c;作为笔记简单记录以下当时的逻辑结构和遇到的问题&#xff0c;有需要参考源码、有疑问或需要提供帮助的可以留言告知 。…

Spring Event

前言 ApplicationEvent 与 ApplicationListener 应用 实现 基于注解 事件过滤 异步事件监听 好处及应用场景 源码阅读 总结 1前言 ApplicationContext 中的事件处理是通过 ApplicationEvent 类和 ApplicationListener 接口提供的。如果将实现了 ApplicationListener …

【AI视野·今日Robot 机器人论文速览 第五十八期】Thu, 19 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Thu, 19 Oct 2023 Totally 25 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers InViG: Benchmarking Interactive Visual Grounding with 500K Human-Robot Interactions Authors Hanbo Zhang, Jie Xu, Yuch…

Qt生成PDF报告

文章目录 一、示意图二、实现部分代码总结 一、示意图 二、实现部分代码 //! 生成测试报告 void MainWindow::createPdf(QString filename, _pdf_msg_& msg, const QMap<QString, int>& ok, const QMap<QString, int>& err) {//QDir dir;if(!dir.exis…

Vue快速入门

一、概述 1.是一套前端框架&#xff0c;可免除原生JavaScript中的DOM操作&#xff0c;基于MVVM思想&#xff0c;实现数据双向绑定。 实现由MVC——>MVVM的转换 二、入门 1.新建HTML页面&#xff0c;引入Vue.js文件 2.在JS代码区&#xff0c;创建Vue核心对象&#xff0c;进行…

嵌入式软件工程师面试题——2025校招专题(三)

说明&#xff1a; 面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但在这里博主希望每一个题目&#xff0c;大家都要…

生产环境元空间内存溢出(OOM)的问题排查

一、现象 2023.10.17下午收到业务反馈&#xff0c;说是接口调用超时&#xff0c;进件系统和核心系统调用外数系统接口时等待过久&#xff0c;引起系统异常。然后我们看了下接口调用的日志&#xff0c;确实接口的响应时间在五十秒左右。我们自己测试了下&#xff0c;发现也是这…

leetcode 503. 下一个更大元素 II、42. 接雨水

下一个更大元素 II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数&…

【c#】2022创建WEB API接口教程demo

c#创建WEB API接口 创建WEB API接口结果图涉及到的技术设计流程创建WEB API接口 结果图 涉及到的技术 设计流程 1、创建WEB api项目,使用控制器和penapi勾选上,第一次创建项目时没有勾选,因为感觉没啥用。后面跑项目的时候,要把接口用swagger去直接生成的时候,还是需要…

自然语言处理---Transformer机制详解之BERT模型介绍

1 BERT简介 BERT是2018年10月由Google AI研究院提出的一种预训练模型. BERT的全称是Bidirectional Encoder Representation from Transformers.BERT在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩&#xff1a;全部两个衡量指标上全面超越人类&#xff0c;并且在11种不…

Postman的简单使用

Postman简介 官网 Postman是Google公司开发的一款功能强大的网页调试与发送HTTP请求&#xff0c;并能运行测试用例的Chrome插件 使用Postman进行简单接口测试 新建测试 → 选择请求方式 → 请求URL&#xff0c;下面用百度作为例子&#xff1a; 参考文档 [1] Postman使用教程…

异常的处理和HTTP状态码的分类

在爬虫过程中&#xff0c;可能会遇到各种异常情况&#xff0c;如网络连接错误、网页解析错误、请求超时等。为了提高爬虫的稳定性和容错性&#xff0c;需要对这些异常进行处理。 异常处理是通过捕获和处理异常来解决程序中出现的错误情况。在爬虫中&#xff0c;常见的异常处理…

RCE 远程代码执行漏洞分析

RCE 漏洞 1.漏洞描述 Remote Command/Code Execute 远程命令执行/远程代码执行漏洞 这种漏洞通常出现在应用程序或操作系统中&#xff0c;攻击者可以通过利用漏洞注入恶意代码&#xff0c;并在受攻击的系统上执行任意命令。 2.漏洞场景 PHP 代码执行PHP 代码注入OS 命令执…

Kettle循环结果集中的数据并传入SQL组件【或转换】里面

简介&#xff1a;在尝试使用了结果集的Demo循环后&#xff0c;进入到生产还是有一点问题的&#xff0c;以下是各个组件的分解解释、遇到的问题&#xff0c;以及解决问题的思路&#xff0c;最后文章的最后会把完整的Ktr文件放出来。记得收藏点赞喔&#xff01; 先来看张图~来自…

OSPF的网络类型

1.3配置OSPF的网络类型 1.3.1实验3&#xff1a;配置P2P网络类型 实验需求 实现单区域OSPF的配置实现通过display命令查看OSPF的网络类型 实验拓扑 实验拓扑如图1-11所示 图1-11 配置P2P网络类型 实验步骤 步骤1&#xff1a;[1] 配置IP地址 路由器R1[2] 的配置 <Huawe…

html iframe 框架有哪些优缺点?

目录 前言&#xff1a; 用法&#xff1a; 理解&#xff1a; 优点&#xff1a; 嵌套外部内容&#xff1a; 独立性&#xff1a; 分离安全性&#xff1a; 跨平台兼容性&#xff1a; 方便维护&#xff1a; 缺点&#xff1a; 性能开销&#xff1a; 用户体验问题&#xf…

vue项目中内嵌iframe,打包上线时候iframe地址如何写?

vue项目中内嵌iframe&#xff0c;打包上线时候iframe地址如何写 一、项目结构1.内嵌的iframe文件位置2.打包后的iframe的位置 二、代码 前提描述&#xff0c;项目是用webpack打包的&#xff0c;内嵌一个完整的js小组件 一、项目结构 1.内嵌的iframe文件位置 2.打包后的iframe的…

图论05-【无权无向】-图的广度优先BFS遍历-路径问题/检测环/二分图/最短路径问题

文章目录 1. 代码仓库2. 单源路径2.1 思路2.2 主要代码 3. 所有点对路径3.1 思路3.2 主要代码 4. 联通分量5. 环检测5.1 思路5.2 主要代码 6. 二分图检测6.1 思路6.2 主要代码6.2.1 遍历每个联通分量6.2.2 判断相邻两点的颜色是否一致 7. 最短路径问题7.1 思路7.2 代码 1. 代码…

听GPT 讲Rust源代码--library/std(2)

File: rust/library/std/src/sys_common/wtf8.rs 在Rust源代码中&#xff0c;rust/library/std/src/sys_common/wtf8.rs这个文件的作用是实现了UTF-8编码和宽字符编码之间的转换&#xff0c;以及提供了一些处理和操作UTF-8编码的工具函数。 下面对这几个结构体进行一一介绍&…

wkhtmltoimage/wkhtmltopdf 使用实践

1. 介绍 wkhtmltopdf/wkhtmltoimage 用于将简单的html页面转换为pdf或图片&#xff1b; 2.安装 downloads 2.1. mac os 下载64-bit 版本然后按照指示安装, 遇到 untrust developers 时&#xff0c;需要在 Settings -> Privacy 处信任下该安装包。 2.2. debian # 可用…