2024 电子科技大学 《820 计算机专业基础》真题及解析(更新中...)

数据结构算法题(15 分,8 + 7) 

1. 比较一棵二叉树的终端节点到根节点的路径长度,路径长度为关键字之和,输出路径长度最短的终端节点。

    输入:第一行输入一个整数 n, 表示结点的个数,第二行输入二叉树的中序遍历序列,第三行输入二叉树的后序遍历序列。

    输出:路径长度最短的叶子节点的关键字。

    用例:

    输入:

    7

    3 2 1 4 5 7 6

    3 1 2 5 6 7 4

    输出:

    1

示例代码 

#include <stdio.h>
#include <stdlib.h>// 定义二叉树节点结构
struct TreeNode {int key;struct TreeNode *left;struct TreeNode *right;
};// 构建二叉树
static struct TreeNode *BuildTree(int *inorder, int *postorder, int inStart, int inEnd, int postStart, int postEnd)
{// 终止条件:中序遍历或后序遍历的起始位置超过结束位置if ((inStart > inEnd) || (postStart > postEnd)) {return NULL;}// 创建根节点struct TreeNode *root = (struct TreeNode *)malloc(sizeof(struct TreeNode));if (!root) {return NULL; // 内存分配失败}// 根据后序遍历确定根节点值root->key = postorder[postEnd];// 在中序遍历中找到根节点的位置int rootIndex;for (rootIndex = inStart; rootIndex <= inEnd; ++rootIndex) {if (inorder[rootIndex] == root->key) {break;}}// 计算左子树和右子树的节点数量int leftSize = rootIndex - inStart;int rightSize = inEnd - rootIndex;// 递归构建左子树和右子树root->left = BuildTree(inorder, postorder, inStart, rootIndex - 1, postStart, postStart + leftSize - 1);root->right = BuildTree(inorder, postorder, rootIndex + 1, inEnd, postEnd - rightSize, postEnd - 1);return root;
}// 计算从叶子节点到根节点的路径长度
static int CalculatePathLength(struct TreeNode *root)
{if (root == NULL) {return 0;}// 递归计算左子树和右子树的路径长度int leftPath = CalculatePathLength(root->left);int rightPath = CalculatePathLength(root->right);// 返回当前节点值与左右子树中较短路径的和return root->key + ((leftPath > rightPath) ? rightPath : leftPath);
}// 找到路径长度最短的终端节点
static void FindShortestPathLeaf(struct TreeNode *root, int *shortestPath, int *shortestLeaf)
{if (root == NULL) {return;}// 当前节点为叶子节点时if ((root->left == NULL) && (root->right == NULL)) {// 计算当前路径长度int pathLength = CalculatePathLength(root);// 更新最短路径和对应的叶子节点值if (*shortestPath == -1 || pathLength < *shortestPath) {*shortestPath = pathLength;*shortestLeaf = root->key;}}// 递归查找左右子树FindShortestPathLeaf(root->left, shortestPath, shortestLeaf);FindShortestPathLeaf(root->right, shortestPath, shortestLeaf);
}int main()
{int n;printf("Enter the number of nodes: ");scanf_s("%d", &n);int *inorder = (int *)malloc(n * sizeof(int));int *postorder = (int *)malloc(n * sizeof(int));if (!inorder || !postorder) {return -1; // 内存分配失败}// 输入中序遍历序列printf("Enter the inorder traversal sequence: ");for (int i = 0; i < n; ++i) {scanf_s("%d", &inorder[i]);}// 输入后序遍历序列printf("Enter the postorder traversal sequence: ");for (int i = 0; i < n; ++i) {scanf_s("%d", &postorder[i]);}// 构建二叉树struct TreeNode *root = BuildTree(inorder, postorder, 0, n - 1, 0, n - 1);int shortestPath = -1;int shortestLeaf = -1;// 寻找路径长度最短的终端节点FindShortestPathLeaf(root, &shortestPath, &shortestLeaf);// 输出结果printf("The terminal node with the shortest path length is: %d\n", shortestLeaf);// 释放动态分配的内存free(inorder);free(postorder);return 0;
}

时间复杂度分析:

  1. 构建二叉树 (BuildTree 函数):

    • 在每次递归调用中,都需要在 inorder 数组中找到根节点的位置,这部分的时间复杂度是 O(n),其中 n 是节点的总数。

    • 总体时间复杂度为 O(n log n),因为每个节点都需要在中序遍历数组中进行查找。

  2. 计算从叶子节点到根节点的路径长度 (CalculatePathLength 函数):

    • 对于每个节点,都需要递归计算其左右子树的路径长度,总体时间复杂度是 O(n),其中 n 是节点的总数。
  3. 找到路径长度最短的终端节点 (FindShortestPathLeaf 函数):

    • 在每个终端节点处都需要计算路径长度,总体时间复杂度是 O(n),其中 n 是节点的总数。
  4. 主函数 (main 函数):

    • 输入数组的读取和动态内存分配的时间复杂度是 O(n)。

    • 最终调用 BuildTreeCalculatePathLengthFindShortestPathLeaf 函数,因此主函数的总体时间复杂度是 O(n log n)。

总体时间复杂度: O(n log n)

空间复杂度分析:

  1. 递归栈空间 (BuildTree 函数):

    • 由于是递归实现,每次递归调用都需要在栈上保存当前递归状态。最坏情况下,递归栈的深度是二叉树的高度,而二叉树的高度最坏情况下可以达到 n(每个节点只有一个子节点形成的斜树)。因此,递归栈空间的最坏情况空间复杂度是 O(n)。
  2. 递归栈空间 (CalculatePathLength 函数):

    • 由于是递归实现,每次递归调用都需要在栈上保存当前递归状态。最坏情况下,递归栈的深度是二叉树的高度,而二叉树的高度最坏情况下可以达到 n。因此,递归栈空间的最坏情况空间复杂度是 O(n)。
  3. 递归栈空间 (FindShortestPathLeaf 函数):

    • 由于是递归实现,每次递归调用都需要在栈上保存当前递归状态。最坏情况下,递归栈的深度是二叉树的高度,而二叉树的高度最坏情况下可以达到 n。因此,递归栈空间的最坏情况空间复杂度是 O(n)。
  4. 动态分配的堆空间:

    • 每个节点都需要动态分配内存,总体空间复杂度是 O(n),其中 n 是节点的总数。
  5. 其他变量和数组:

    • 除递归栈和动态分配的堆空间外,程序中使用了一些整型变量和输入数组。这部分的空间复杂度是 O(1)。

总体空间复杂度: O(n)

输出示例

2. 在 n 个数中查询 k 个指定的数(要求最少存储)

示例代码

#include <stdio.h>
#include <stdlib.h>// 交换数组中两个元素的值
static void Swap(int *a, int *b)
{int temp = *a;*a = *b;*b = temp;
}// 最小堆调整
static void Heapify(int arr[], int n, int i)
{int largest = i;    // 初始化最大值为根节点int left = 2 * i + 1;   // 左子节点int right = 2 * i + 2;  // 右子节点// 如果左子节点大于根节点if (left < n && arr[left] > arr[largest]) {largest = left;}// 如果右子节点大于最大值if (right < n && arr[right] > arr[largest]) {largest = right;}// 如果最大值不是根节点if (largest != i) {Swap(&arr[i], &arr[largest]);// 递归调整受影响的子树Heapify(arr, n, largest);}
}// 构建最小堆
static void BuildHeap(int arr[], int n)
{// 构建堆(重新排列数组)for (int i = n / 2 - 1; i >= 0; i--) {Heapify(arr, n, i);}
}// 堆排序
static void HeapSort(int arr[], int n)
{// 构建最大堆BuildHeap(arr, n);// 依次从堆中取出元素for (int i = n - 1; i > 0; i--) {// 将当前根节点移至末尾Swap(&arr[0], &arr[i]);// 在减小的堆上调用最大堆调整Heapify(arr, i, 0);}
}// 二分查找
static int BinarySearch(int *array, int low, int high, int target)
{while (low <= high) {int mid = low + (high - low) / 2;if (array[mid] == target) {return mid + 1; // 位置从1开始} else if (array[mid] < target) {low = mid + 1;} else {high = mid - 1;}}return 0; // 未找到
}int main()
{int n;// 输入 nprintf("Enter the number of elements (n): ");scanf_s("%d", &n);// 输入 n 个数printf("Enter %d numbers:\n", n);int *array = (int *)malloc(n * sizeof(int));if (array == NULL) {fprintf(stderr, "Memory allocation failed\n");return 1;}for (int i = 0; i < n; i++) {scanf_s("%d", &array[i]);}// 使用最小堆排序HeapSort(array, n);// 输出排序后的数组printf("Sorted array:\n");for (int i = 0; i < n; i++) {printf("%d ", array[i]);}// 输入 kint k;printf("\nEnter the number of elements to search (k): ");scanf_s("%d", &k);// 输入 k 个数printf("Enter %d numbers to search:\n", k);for (int i = 0; i < k; i++) {int searchNumber;scanf_s("%d", &searchNumber);// 使用二分查找在有序数组中查找位置int position = BinarySearch(array, 0, n - 1, searchNumber);if (position) {printf("%d ", position);} else {printf("Not Found ");}}// 释放动态分配的内存free(array);return 0;
}

时间复杂度分析:

  1. 堆排序的时间复杂度:

    • 构建堆: 时间复杂度为 O(n)。对每个非叶子节点进行堆调整,而非叶子节点的数量是 n/2,其中 n 是元素的总数。

    • 排序: 每次将最大值放到数组末尾,然后对剩余的部分进行堆调整。堆调整的时间复杂度是 O(log n),而总共需要进行 n 次调整。因此,排序的时间复杂度为 O(n log n)。

    综合起来,堆排序的时间复杂度为 O(n + n log n) = O(n log n)。

  2. 二分查找的时间复杂度: 二分查找的时间复杂度为 O(k log n),其中 n 是数组的长度,k 是要搜索的元素数量。每一次都将搜索范围缩小一半,直到找到目标值或者搜索范围为空。由于 k <= n,可以将其表示为 O(n log n)。

综合起来,整个程序的时间复杂度主要由堆排序决定,为 O(n log n)。

空间复杂度分析:

  1. 堆排序的空间复杂度: 堆排序是原地排序算法,不需要额外的空间来存储数据结构,只需要常数级别的辅助空间。因此,堆排序的空间复杂度为O(1)。

  2. 二分查找的空间复杂度: 二分查找的空间复杂度也是常数级别的,为O(1)。

  3. 输入数组的空间复杂度: 在堆排序前,程序使用了一个大小为 n 的整数数组 (array) 来存储输入的 n 个数。因此,这部分的空间复杂度为 O(n)。

  4. 其他变量的空间复杂度: 除了输入数组外,程序使用了一些常数级别的辅助变量,如循环中的索引和临时变量。这些额外变量的空间复杂度可以被认为是 O(1)。

综合起来,整个程序的空间复杂度为 O(n),其中 n 是输入的数组大小。

输出示例

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

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

相关文章

Rustdesk打开Win10 下客户端下面服务不会自启,显示服务未运行

环境: Rustdesk1.19 问题描述: Rustdesk打开Win10 下客户端下面服务不会自启,显示服务未运行 解决方案: 1.查看源代码 pub async fn start_all() {crate::hbbs_http::sync::start();let mut nat_tested = false;check_zombie()

go work

vscode gopls插件工具依赖go work,否则会报错 https://github.com/golang/tools/blob/master/gopls/doc/workspace.md Go 1.18 新特性多模块工作区教程-让多模块开发变得简单 - Go语言中文网 - Golang中文社区

A2DP Source如何从android系统拿到音频数据

Android 13 简单来说就是两条本地socket通道&#xff0c;分别使用文件&#xff1a; #define A2DP_CTRL_PATH "/data/misc/bluedroid/.a2dp_ctrl" #define A2DP_DATA_PATH "/data/misc/bluedroid/.a2dp_data" A2DP_CTRL_PATH是控制通道&#xff0c;A2DP…

物联网协议Coap中Californium CoapClient解析

目录 前言 一、CoapClient对象 1、类定义 2、Client方法调用 二、发送请求 1、构建请求 2、发起请求 3、接收响应 总结 前言 在之前的博客中物联网协议Coap之Californium CoapServer解析&#xff0c;文中简单介绍了CoapServer的实现。在物联网开发环境中&#xff0c;除了…

给Flutter + FireBase 增加 badge 徽章,App启动器 通知红点。

在此之前需要配置好 firebase 在flutter 在项目中。&#xff08;已经配置好的可以忽略此提示&#xff09; Firebase 配置教程&#xff1a;flutter firebase 云消息通知教程 (android-安卓、ios-苹果)_flutter firebase_messaging ios环境配置-CSDN博客 由于firebase 提供的消息…

在Gitee上维护Erpnext源

在Gitee上维护Erpnext源 官方的frappe和erpnext地址: GitHub - frappe/frappe: Low code web framework for real world applications, in Python and Javascript GitHub - frappe/erpnext: Free and Open Source Enterprise Resource Planning (ERP) 1, 仓库地址输入frappe的官…

HAL——SPI

学习目标 掌握SPI配置方式掌握SPI读写操作 学习内容 需求 SPI配置 打开SPI1,选中全双工模式。观察下方自动生成的引脚&#xff0c;是否和自己开发板引脚对应。 修改引脚&#xff0c;来动右侧芯片引脚视图&#xff0c;找到开发板对应引脚&#xff0c;进行修改。 观察修改后的…

SpringBoot-Redis

依赖 <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId>配置 # 服务器连接端口 spring.redis.port6379 # 服务器地址 spring.redis.host127.0.0.1 # 数据库索引&#xff08;默认为0&#xff09…

【GitHub】-design-pattern-extend(设计模式扩展)

写在前面 偶然间看到一篇文章 《Java 中保持扩展性的几种套路和实现》&#xff0c;写的不错&#xff0c;但是类图画的差了点儿意思。于是&#xff0c;自己动手画了画&#xff0c;对其中的内容作了一些调整&#xff0c;对包做了进一步划分&#xff0c;便于理解消化。以下是对Git…

Linux rsh命令教程:远程shell命令的使用和注意事项(附案例详解和注意事项)

Linux rsh命令介绍 rsh&#xff08;remote shell&#xff09;提供用户环境&#xff0c;也就是Shell&#xff0c;以便指令能够在指定的远端主机上执行。rsh连接到指定的主机&#xff0c;并执行指定的命令。rsh将其标准输入复制到远程命令&#xff0c;将远程命令的标准输出复制到…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑多元不确定性和备用需求的微电网双层鲁棒容量规划》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这个标题涉及微电网&#xff08;Microgrid&#xff09;的双层鲁棒容量规划&#xff0c;考虑了多元不确定性和备用需求。让我们逐步解读这个标题&#xf…

【KD】知识蒸馏(knowledge distillation)简单介绍

最近学到了知识蒸馏的相关知识&#xff0c;来简单总结一下૮꒰ ˶• ༝ •˶꒱ა。 知识蒸馏 知识蒸馏&#xff0c;是一种模型压缩的手段。通过训练学生模仿教师的行为&#xff0c;将嵌入在大的教师模型中的知识迁移到小的学生模型。 例如&#xff0c;TinyBERT(Jiao et al.,2…

RocketMQ源码 发送顺序消息源码分析

前言 rocketmq 发送顺序消息和普通消息的主流程区别大部分一致的&#xff0c;区别在于&#xff1a;普通消息发送时&#xff0c;从所有broker的队列集合中 轮询选择一个队列&#xff0c;而顺序队列可以提供用户自定义消息队列选择器&#xff0c;从NameServer 分配的顺序 broker…

使用JavaScript实现动态生成并管理购物车的深入解析

一、引言 在当前的互联网时代&#xff0c;电子商务已成为我们日常生活的重要组成部分。购物车作为电子商务网站的核心功能之一&#xff0c;其实现方式对于用户体验至关重要。本文将深入探讨如何使用JavaScript实现一个动态生成并管理购物车的功能&#xff0c;并详细介绍其实现…

Linux Shell数学运算与条件测试

一、Shell数学运算 1.Shell常见的算术运算符号 序号算术运算符号意义1、-、*、/、%加、减、乘、除、取余2**幂运算3、–自增或自减4&&、||、&#xff01;与、或、非5、!相等、不相等&#xff0c;也可写成6、、-、*、/、%赋值运算符&#xff0c;a1相等于aa1 2.Shell常…

.NET Standard 支持的 .NET Framework 和 .NET Core

.NET Standard 是针对多个 .NET 实现推出的一套正式的 .NET API 规范。 推出 .NET Standard 的背后动机是要提高 .NET 生态系统中的一致性。 .NET 5 及更高版本采用不同的方法来建立一致性&#xff0c;这种方法在大多数情况下都不需要 .NET Standard。 但如果要在 .NET Framewo…

QT 高DPI解决方案

一、根据DPI实现动态调整控件大小&#xff08;三种方式&#xff09; 1、QT支持高DPI&#xff08;针对整个进程中所有的UI&#xff09; // main函数中 QApplication::setAttribute(Qt::AA_EnableHighDpiScaling)tips&#xff1a;&#xff08;1&#xff09;如果不想全局设置&am…

Nodejs搭配axios下载图片

新建一个文件夹&#xff0c;npm i axios 实测发现只需保留node_modules文件夹&#xff0c;删除package.json不影响使用 1.纯下载图片 其实该方法不仅可以下载图片&#xff0c;其他的文件都可以下载 const axios require(axios) const fs require(fs) var arrPic [https:…

最大输出 18W,集成 Type-C PD 输出和各种快充输出协议

一、产品简介 IP6510是一款集成同步开关的降压转换器、支持 9 种输出快充协议、支持 Type-C 输出和 USB PD协议&#xff0c;为车载充电器、快充适配器、智能排插提供完整的解决方案。 IP6510 内置功率 MOS&#xff0c;输入电压范围是 4.5V到 32V&#xff0c;输出电压范围是 3…

案例101:基于微信小程序的停车共享管理系统设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…