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

用c语言实现——一个交互式的中序线索二叉树系统,支持用户动态构建、线索化、遍历和查询功能

知识补充:什么是中序线索化

                          中序遍历是什么

一、代码解释

1.结构体定义

Node 结构体:
成员说明:
int data:存储节点的数据值。
struct Node* lchild:该节点的左孩子

struct Node* rchild:该节点的右孩子。
int ltag 和 int rtag:用于标记左孩子和右孩子指针的性质,0 表示指向真正的子节点,1 表示指向该节点在中序遍历中的前驱或后继节点。 

作用:表示二叉树中的一个节点。

QueueNode 结构体:
成员说明:
Node* treeNode:存储一个二叉树节点的指针。
struct QueueNode* next:指向队列中下一个元素。

作用:用于构建队列,辅助层次构建二叉树。

Queue 结构体:
成员说明:
QueueNode* front:指向队列的头部。
QueueNode* rear:指向队列的尾部。

作用:表示一个队列。

 

2.队列操作函数createQueue

createQueue 函数:
使用 malloc 分配内存以存储 Queue 结构体。
检查分配内存是否成功,若失败则调用 exit(1) 终止程序。
初始化队列的 头front 和 尾rear 指针为 NULL,表示队列为空。
返回指向新创建队列的指针。 

作用:创建一个新的空队列。

3.队列的入队操作enqueue

enqueue 函数
参数:
Queue* q:指向队列的指针。
Node* treeNode:指向要插入队列的二叉树节点的指针。

动态分配内存以存储一个新的队列节点。

 检查内存分配是否成功,若失败则直接返回,不进行后续操作。

 

将传入的二叉树节点的地址赋值给新队列节点的 treeNode 成员,建立关联。

初始化新队列节点的 next 指针为 NULL,表示其后没有其他节点。

判断队列是否为空(即尾指针 rear 是否为 NULL),若是空队列,则将新节点同时作为队头和队尾。

若队列不为空,则将原队尾节点的 next 指针指向新节点,并更新队尾指针为新节点。 

作用:将一个二叉树节点插入到队列中。

4.队列的出队操作dequeue

dequeue 函数
参数:Queue* q,指向队列的指针。

作用:从队列中移除并返回队头的二叉树节点。


 

检查队列是否为空,若为空则返回 NULL,表示没有节点可以出队。

将队头节点保存到临时指针 temp 中,以便后续释放内存。

获取队头节点所关联的二叉树节点,并保存到 treeNode 中,这是要返回的结果。

将队头指针移动到下一个节点,实现队头的前进。

检查队列是否变为空,若变为空则将队尾指针也设置为 NULL。

释放之前保存的队头节点所占用的内存,避免内存泄漏。

返回出队的二叉树节点。

5.判断队列是否为空函数isEmpty

isEmpty 函数
参数:Queue* q,指向队列的指针。
返回值:如果队列为空,返回非零值(真);否则返回 0(假)。
实现:通过检查队列的 front 指针是否为 NULL 来判断队列是否为空。在队列的链式存储结构中,当 front 指针为 NULL 时,表示队列中没有任何节点,即队列为空。

作用:判断队列是否为空。

6.释放队列函数freeQueue

freeQueue 函数
参数:Queue* q,指向要释放的队列的指针。

作用:释放队列及其包含的所有节点所占用的内存。

while (!isEmpty(q)):使用一个循环,只要队列不为空就持续执行。
在循环体内调用 出队dequeue(q) 函数,不断移除队列中的节点并释放每个节点的内存。
这个过程会一直持续到队列被完全清空为止。
free(q):在队列为空后,释放队列本身的内存空间。

 7.创建中序线索二叉树createInThreadedTree

createInThreadedTree 函数
作用:对整个二叉树进行中序线索化。
参数:Node* root,指向二叉树的根节点。

①创建一个指针变量 pre,初始化为 NULL。这个变量将用于记录中序遍历过程中的前一个节点。

②调用中序线索化函数 inThreading,从根节点开始对整个二叉树进行中序线索化,并传入 pre 的地址,以便在递归过程中能够记录和更新前驱节点

8.二叉树节点创建createNode

createNode 函数
作用:创建一个新的二叉树节点。
参数:int data,表示要存储在新节点中的数据值。
返回值:返回指向新创建的二叉树节点的指针。如果内存分配失败,则返回 NULL。

①使用 malloc 函数动态分配内存,为新的二叉树节点分配足够的空间。sizeof(Node) 计算出 Node 结构体的大小。

②检查内存分配是否成功。如果 newNode 为 NULL,表示内存分配失败,程序调用 exit(1) 终止执行。

③将传入的 data 值赋给新节点的 data 成员。

④初始化新节点的左右孩子指针为 NULL,表示该节点目前没有子节点。

⑤初始化新节点的左右标签为 0,表示左右指针目前指向的是实际的子节点(尽管此时子节点还未创建)。

⑥返回指向新创建节点的指针。

9.中序线索化操作inThreading

inThreading 函数
作用:对二叉树进行中序线索化。
参数:
Node* root:指向当前要线索化的节点。
Node** pre:指向一个指针变量,该变量保存了中序遍历过程中上一个访问的节点。

①如果当前节点为空,直接返回。因为空节点无需线索化。

②递归对当前节点的左子树进行中序线索化。这一步符合中序遍历的顺序,先处理左子树。

③如果当前节点没有左孩子,则将当前节点的左指针指向中序遍历中的前驱节点(即 pre 指向的节点),并将左标签 ltag 设置为 1,表示这个左指针是线索而不是指向实际的左孩子。

④如果前驱节点存在且前驱节点没有右孩子,则将前驱节点的右指针指向当前节点,并将前驱节点的右标签 rtag 设置为 1,表示这个右指针是线索而不是指向实际的右孩子。

⑤更新 pre 指针,使其指向当前节点,表示当前节点已经成为下一个节点的前驱。

⑥递归对当前节点的右子树进行中序线索化。这一步符合中序遍历的顺序,在处理完左子树和当前节点后,最后处理右子树。

10.查找前驱和后继节点操作findPredecessor&findSuccessor

findPredecessor 函数
作用:找到指定节点在中序遍历下的前驱节点。
参数:Node* node,指向要查找前驱的节点。

返回值:返回指向中序前驱节点的指针。如果没有前驱,则返回 NULL。

findSuccessor 函数
作用:找到指定节点在中序遍历下的后继节点。
参数:Node* node,指向要查找后继的节点。
返回值:返回指向中序后继节点的指针。如果没有后继,则返回 NULL。

findPre:

①如果节点的左标签为1,说明其左指针是指向前驱的线索,直接返回该左指针。

②如果左标签不是1,则从该节点的左孩子开始查找。

③沿着左孩子的右子树一直向下寻找,直到找到一个右标签为1的节点或者无法继续。

④返回找到的前驱节点。

findSuc:

①如果节点的右标签为1,说明其右指针指向后继的线索,直接返回该右指针。

②如果右标签不是1,则从该节点的右孩子开始查找。

③沿着右孩子的左子树一直向下寻找,直到找到一个左标签为1的节点或者无法继续。

④返回找到的后继节点。

11. 中序遍历printInOrderSequece

printInOrderSequence 函数
作用:中序遍历线索二叉树并打印节点数据。
参数:Node* root,指向二叉树的根节点。

①如果根节点为空,直接返回,结束函数执行。

②创建一个指针变量 current,初始化为根节点,用于遍历树。

③将 current 移动到最左节点。因为线索二叉树的最左节点是中序遍历的第一个节点。

④开始主循环,循环条件是 current 不为 NULL。

⑤打印当前节点的数据。

⑥如果当前节点的右标签为1,说明右指针是指向后继的线索。

⑦移动 current 到后继节点。

⑧如果右标签不是1,说明右指针指向实际的右孩子。

⑨移动 current 到右孩子。

⑩将 current 移动到其右子树的最左节点,这是为了找到下一个中序遍历的节点。

12.查询前驱和后继节点findNodeByValue

findNodeByValue 函数
作用:在中序线索二叉树中查找具有指定值的节点。
参数:
Node* root:指向二叉树的根节点。
int value:要查找的值。
返回值:如果找到具有指定值的节点,返回指向该节点的指针;否则返回 NULL。

①如果根节点为空,直接返回 NULL,因为空树中不存在任何节点。

②创建一个指针变量 current,初始化为根节点,用于遍历树。

③用while循环将 current 移动到树的最左节点。这一步确保从树的中序遍历的起始位置开始查找。

④开始主循环,循环条件是 current 不为 NULL。

⑤检查当前节点的数据是否等于要查找的值。如果是,直接返回当前节点指针。

⑥如果当前节点的右标签为1,说明右指针是指向中序后继的线索。

     移动 current 到后继节点。

⑦ 如果右标签不是1,说明右指针指向实际的右孩子。

     移动 current 到右孩子。

     将 current 移动到其右子树的最左节点,以便继续中序遍历。

⑧如果循环结束后仍未找到匹配的节点,返回 NULL。

13.安全释放二叉树freeTree

freeTree 函数
作用:递归释放二叉树中所有节点所占用的内存,防止内存泄漏。
参数:Node* root,指向二叉树的根节点。

①如果根节点为空,直接返回。因为空树无需释放内存。

②如果当前节点的左标签为0,说明左指针指向实际的左孩子节点,递归释放左子树的内存。

③如果当前节点的右标签为0,说明右指针指向实际的右孩子节点,递归释放右子树的内存。 

④释放当前节点的内存。

14.用户输入二叉树操作bulidTreeFromInput

buildTreeFromInput 函数
作用:根据用户输入构建二叉树。
返回值:返回指向构建好的二叉树根节点的指针。如果用户输入-1,则返回 NULL,表示不构建树。

①声明一个整型变量 value,用于存储用户输入的节点值。

    提示用户输入根节点的值。

②读取用户输入。如果输入失败或者用户输入-1,则返回 NULL,表示不构建树。

③创建根节点。

   创建一个队列,用于辅助构建树。

   将根节点入队。

④当队列不为空时,循环执行以下操作:

    取出队列中的节点。

    提示用户输入当前节点左子节点的值。

    读取用户输入。

    如果输入的值不是-1,则创建左子节点,并将其入队。

    提示用户输入当前节点右子节点的值。

    读取用户输入。

    如果输入的值不是-1,则创建右子节点,并将其入队。

⑤释放队列资源。

⑥返回根节点指针。

15.主函数逻辑

1.循环构建和处理二叉树:使用 while (1) 创建一个无限循环,允许用户反复构建和处理二叉树,直到用户选择结束程序。

2.打印菜单:通过 printf 输出菜单信息,提示用户当前操作是中序线索二叉树操作。

3.构建二叉树:

调用 buildTreeFromInput 函数根据用户输入构建二叉树。
如果用户输入-1,表示不构建树,则打印“程序结束。”并退出循环。

4.线索化二叉树:

调用 createInThreadedTree 函数对构建好的二叉树进行中序线索化。

5.中序遍历并打印:

打印提示信息“中序遍历结果:”。
调用 printInOrderSequence 函数进行中序遍历并打印结果。

6.查询节点:

使用嵌套的 while (1) 循环,反复提示用户输入要查询的节点值。
如果用户输入-1,退出查询循环。
调用 findNodeByValue 函数查找指定值的节点。
如果找不到节点,打印提示信息并跳过本次循环。
调用 findPredecessor 和 findSuccessor 函数查找节点的前驱和后继。
打印前驱和后继的信息,使用三元运算符处理空节点的情况,使其显示为“无”。

7.释放内存:

调用 freeTree 函数释放二叉树占用的内存。
打印提示信息,告知用户内存已释放,准备新一轮输入。

8.结束程序

二、完整代码

#include <stdio.h>
#include <stdlib.h>typedef struct Node 
{int data;struct Node* lchild;struct Node* rchild;int ltag;int rtag;
} Node;// 队列结构用于层次构建二叉树
typedef struct QueueNode 
{Node* treeNode;struct QueueNode* next;
} QueueNode;typedef struct Queue
{QueueNode* front;QueueNode* rear;
} Queue;// 队列操作函数
Queue* createQueue()
{Queue* q = (Queue*)malloc(sizeof(Queue));if (q == NULL){exit(1);}q->front = q->rear = NULL;return q;
}void enqueue(Queue* q, Node* treeNode) 
{QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));if (newNode == NULL){return;}newNode->treeNode = treeNode;newNode->next = NULL;if (q->rear == NULL){q->front = q->rear = newNode;}else{q->rear->next = newNode;q->rear = newNode;}
}Node* dequeue(Queue* q)
{if (q->front == NULL) return NULL;QueueNode* temp = q->front;Node* treeNode = temp->treeNode;q->front = q->front->next;if (q->front == NULL)q->rear = NULL;free(temp);return treeNode;
}int isEmpty(Queue* q) 
{return q->front == NULL;
}void freeQueue(Queue* q)
{while (!isEmpty(q)) {dequeue(q);}free(q);
}// 二叉树节点创建
Node* createNode(int data) 
{Node* newNode = (Node*)malloc(sizeof(Node));if (newNode == NULL){exit(1);}newNode->data = data;newNode->lchild = newNode->rchild = NULL;newNode->ltag = newNode->rtag = 0;return newNode;
}// 中序线索化
void inThreading(Node* root, Node** pre)
{if (!root)return;inThreading(root->lchild, pre);if (!root->lchild) {root->lchild = *pre;root->ltag = 1;}if (*pre && !(*pre)->rchild) {(*pre)->rchild = root;(*pre)->rtag = 1;}*pre = root;inThreading(root->rchild, pre);
}void createInThreadedTree(Node* root) 
{Node* pre = NULL;inThreading(root, &pre);
}// 查找前驱和后继
Node* findPredecessor(Node* node) 
{if (node->ltag == 1) return node->lchild;Node* p = node->lchild;while (p && p->rtag == 0) p = p->rchild;return p;
}Node* findSuccessor(Node* node) 
{if (node->rtag == 1)return node->rchild;Node* p = node->rchild;while (p && p->ltag == 0) p = p->lchild;return p;
}// 中序遍历线索二叉树
void printInOrderSequence(Node* root)
{if (!root) return;Node* current = root;while (current->ltag == 0) current = current->lchild;while (current){printf("%d ", current->data);if (current->rtag == 1) {current = current->rchild;}else {current = current->rchild;while (current && current->ltag == 0) {current = current->lchild;}}}
}// 通过值查找节点
Node* findNodeByValue(Node* root, int value) 
{if (!root)return NULL;Node* current = root;while (current->ltag == 0)current = current->lchild;while (current) {if (current->data == value) return current;if (current->rtag == 1){current = current->rchild;}else {current = current->rchild;while (current && current->ltag == 0) {current = current->lchild;}}}return NULL;
}// 安全释放二叉树
void freeTree(Node* root)
{if (!root) return;if (root->ltag == 0)freeTree(root->lchild);if (root->rtag == 0)freeTree(root->rchild);free(root);
}// 用户输入构建二叉树
Node* buildTreeFromInput()
{int value;printf("输入根节点值(-1结束): ");if (scanf_s("%d", &value) != 1 || value == -1)return NULL;Node* root = createNode(value);Queue* q = createQueue();enqueue(q, root);while (!isEmpty(q)) {Node* current = dequeue(q);printf("输入节点%d的左子节点(-1为空): ", current->data);scanf_s("%d", &value);if (value != -1) {current->lchild = createNode(value);enqueue(q, current->lchild);}printf("输入节点%d的右子节点(-1为空): ", current->data);scanf_s("%d", &value);if (value != -1){current->rchild = createNode(value);enqueue(q, current->rchild);}}freeQueue(q);return root;
}int main()
{while (1){printf("\n===== 中序线索二叉树操作 =====\n");Node* root = buildTreeFromInput();if (!root) {printf("程序结束。\n");break;}createInThreadedTree(root);printf("中序遍历结果: ");printInOrderSequence(root);printf("\n");int query;while (1){printf("\n输入要查询的节点值(-1返回): ");scanf_s("%d", &query);if (query == -1)break;Node* target = findNodeByValue(root, query);if (!target) {printf("节点%d不存在!\n", query);continue;}Node* pred = findPredecessor(target);Node* succ = findSuccessor(target);printf("前驱: %s\t后继: %s\n",pred ? itoa(pred->data, (char[]) { 0 }, 10) : "无",succ ? itoa(succ->data, (char[]) { 0 }, 10) : "无");}freeTree(root);printf("内存已释放,准备新一轮输入...\n");}return 0;
}

该代码用c语言实现的——一个完整的中序线索二叉树工具,支持用户动态构建、线索化、遍历和查询功能,适合教学演示或需要快速查找前驱/后继节点的场景。数据结构!!!

相关文章:

用c语言实现——一个交互式的中序线索二叉树系统,支持用户动态构建、线索化、遍历和查询功能

知识补充&#xff1a;什么是中序线索化 中序遍历是什么 一、代码解释 1.结构体定义 Node 结构体&#xff1a; 成员说明&#xff1a; int data&#xff1a;存储节点的数据值。 struct Node* lchild&#xff1a;该节点的左孩子 struct Node* rchild&#xff1a;该节点的右孩子…...

Pale Moon:速度优化的Firefox定制浏览器

Pale Moon是一款基于Firefox浏览器的定制版浏览器&#xff0c;专为追求速度和性能的用户设计。它使用开放源代码创建&#xff0c;经过高度优化&#xff0c;适用于现代处理器&#xff0c;提供了更快的页面加载速度和更高效的脚本处理能力。Pale Moon不仅继承了Firefox的安全性和…...

广东省省考备考(第七天5.10)—言语:逻辑填空(每日一练)

错题 解析 第一空&#xff0c;搭配“各个环节”&#xff0c;根据“我国已经形成了相对完善的中药质量标准控制体系”可知&#xff0c;横线处应体现“包含”之意&#xff0c;C项“涵盖”指包括、覆盖&#xff0c;D项“囊括”指把全部包罗在内&#xff0c;均与“各个环节”搭配得…...

Gartner《Container发布与生命周期管理最佳实践》学习心得

近日&#xff0c;Gartner发布了《Best Practices for Container Release and Life Cycle Management》&#xff0c; 报告为技术专业人士提供了关于容器发布和生命周期管理的深入指导。这份报告强调了容器在现代应用开发和部署中的核心地位&#xff0c;并提供了一系列最佳实践&…...

内存、磁盘、CPU区别,Hadoop/Spark与哪个联系密切

1. 内存、磁盘、CPU的区别和作用 1.1 内存&#xff08;Memory&#xff09; 作用&#xff1a; 内存是计算机的短期存储器&#xff0c;用于存储正在运行的程序和数据。它的访问速度非常快&#xff0c;比磁盘快几个数量级。在分布式计算中&#xff0c;内存用于缓存中间结果、存储…...

SpringCloud之Eureka基础认识-服务注册中心

0、认识Eureka Eureka 是 Netflix 开源的服务发现组件&#xff0c;后来被集成到 Spring Cloud 生态中&#xff0c;成为 Spring Cloud Netflix 的核心模块之一。它主要用于解决分布式系统中​​服务注册与发现​​的问题。 Eureka Server 有必要的话&#xff0c;也可以做成集群…...

MySQL 中如何进行 SQL 调优?

在MySQL中进行SQL调优是一个系统性工程&#xff0c;需结合索引优化、查询改写、性能分析工具、数据库设计及硬件配置等多方面策略。以下是具体优化方法及案例说明&#xff1a; 一、索引优化&#xff1a;精准提速的关键 索引类型选择 普通索引&#xff1a;加速频繁查询的列&…...

Linux平台下SSH 协议克隆Github远程仓库并配置密钥

目录 注意&#xff1a;先提前配置好SSH密钥&#xff0c;然后再git clone 1. 检查现有 SSH 密钥 2. 生成新的 SSH 密钥 3. 将 SSH 密钥添加到 ssh-agent 4. 将公钥添加到 GitHub 5. 测试 SSH 连接 6. 配置 Git 使用 SSH 注意&#xff1a;先提前配置好SSH密钥&#xff0c;然…...

Android平台FFmpeg音视频开发深度指南

一、FFmpeg在Android开发中的核心价值 FFmpeg作为业界领先的多媒体处理框架&#xff0c;在Android音视频开发中扮演着至关重要的角色。它提供了&#xff1a; 跨平台支持&#xff1a;统一的API处理各种音视频格式完整功能链&#xff1a;从解码、编码到滤镜处理的全套解决方案灵…...

QSFP+、QSFP28、QSFP-DD接口分别实现40G、100G、200G/400G以太网接口

常用的光模块结构形式&#xff1a; 1&#xff09;QSFP等效于4个SFP&#xff0c;支持410Gbit/s通道传输&#xff0c;可通过4个通道实现40Gbps传输速率。与SFP相比&#xff0c;QSFP光模块的传输速率可达SFP光模块的四倍&#xff0c;在部署40G网络时可直接使用QSFP光模块&#xf…...

MySQL事务和JDBC中的事务操作

一、什么是事务 事务是数据库操作的最小逻辑单元&#xff0c;具有"全有或全无"的特性。以银行转账为例&#xff1a; 典型场景&#xff1a; 从A账户扣除1000元 向B账户增加1000元 这两个操作必须作为一个整体执行&#xff0c;要么全部成功&#xff0c;要么全部失败…...

Linux系统下安装mongodb

1. 配置MongoDB的yum仓库 创建仓库文件 sudo vi /etc/yum.repos.d/mongodb-org.repo添加仓库配置 根据系统版本选择配置&#xff08;以下示例为CentOS 7和CentOS 9的配置&#xff09;&#xff1a; CentOS 7&#xff08;安装MongoDB 5.0/4.2等旧版本&#xff09;&#xff1a; In…...

JavaScript篇:async/await 错误处理指南:优雅捕获异常,告别失控的 Promise!

大家好&#xff0c;我是江城开朗的豌豆&#xff0c;一名拥有6年以上前端开发经验的工程师。我精通HTML、CSS、JavaScript等基础前端技术&#xff0c;并深入掌握Vue、React、Uniapp、Flutter等主流框架&#xff0c;能够高效解决各类前端开发问题。在我的技术栈中&#xff0c;除了…...

智能时代下,水利安全员证如何引领行业变革?

当 5G、AI、物联网等技术深度融入水利工程&#xff0c;传统安全管理模式正经历颠覆性变革。在这场智能化浪潮中&#xff0c;水利安全员证扮演着怎样的角色&#xff1f;又将如何重塑行业人才需求格局&#xff1f; 水利工程智能化转型对安全管理提出新挑战。无人机巡检、智能监测…...

使用FastAPI和React以及MongoDB构建全栈Web应用03 全栈开发快速入门

一、什么是全栈开发 A full-stack web application is a complete software application that encompasses both the frontend and backend components. It’s designed to interact with users through a web browser and perform actions that involve data processing and …...

NHANES稀有指标推荐:HALP score

文章题目&#xff1a;Associations of HALP score with serum prostate-specific antigen and mortality in middle-aged and elderly individuals without prostate cancer DOI&#xff1a;10.3389/fonc.2024.1419310 中文标题&#xff1a;HALP 评分与无前列腺癌的中老年人血清…...

软考错题集

一个有向图具有拓扑排序序列&#xff0c;则该图的邻接矩阵必定为&#xff08;&#xff09;矩阵。 A.三角 B.一般 C.对称 D.稀疏矩阵的下三角或上三角部分包含非零元素&#xff0c;而其余部分为零。一般矩阵这个术语太过宽泛&#xff0c;不具体指向任何特定性 质的矩阵。对称矩阵…...

llama.cpp无法使用gpu的问题

使用cuda编译llama.cpp后&#xff0c;仍然无法使用gpu。 ./llama-server -m ../../../../../model/hf_models/qwen/qwen3-4b-q8_0.gguf -ngl 40 报错如下 ggml_cuda_init: failed to initialize CUDA: forward compatibility was attempted on non supported HW warning: n…...

[面试]SoC验证工程师面试常见问题(五)TLM通信篇

SoC验证工程师面试常见问题(五) 摘要:UVM (Universal Verification Methodology) 中的 TLM (Transaction Level Modeling) 通信是一种用于在验证组件之间传递事务(Transaction)的高层次抽象机制。它通过端口(Port)和导出(Export)实现组件间的解耦通信,避免了信…...

Spring循环依赖问题

个人理解&#xff0c;有问题欢迎指正。 Spring 生命周期中&#xff0c;首先使用构造方法对 bean 实例化&#xff0c;实例化完成之后才将不完全的 bean放入三级缓存中提前暴露出 bean&#xff0c;然后进行属性赋值&#xff0c;此时容易出现循环依赖问题。 由此可见&#xff0c;…...

AtCoder Beginner Contest 405(CD)

C - Sum of Product 翻译&#xff1a; 给你一个长为N的序列。 计算的值。 思路&#xff1a; 可使用前缀和快速得到区间和&#xff0c;在遍历 i 即可。&#xff08;前缀和&#xff09; 实现&#xff1a; #include<bits/stdc.h> using namespace std; using ll long lon…...

MindSpore框架学习项目-ResNet药物分类-模型优化

目录 5.模型优化 5.1模型优化 6.结语 参考内容&#xff1a; 昇思MindSpore | 全场景AI框架 | 昇思MindSpore社区官网 华为自研的国产AI框架&#xff0c;训推一体&#xff0c;支持动态图、静态图&#xff0c;全场景适用&#xff0c;有着不错的生态 本项目可以在华为云modelar…...

C. scanf 函数基础

scanf 函数 1. scanf 函数基础1.1 函数原型与头文件1.2 格式化输入的基本概念2.1 常见格式说明符整数格式说明符浮点数格式说明符字符和字符串格式说明符其他格式说明符2.2 格式说明符的高级用法宽度修饰符精度修饰符跳过输入字段宽度组合修饰符对齐修饰符实际应用示例3.2 精度…...

《C++探幽:模板从初阶到进阶》

文章目录 :red_circle:一、模板基础&#xff1a;开启泛型编程之门&#xff08;一&#xff09;泛型编程的必要性&#xff08;二&#xff09;函数模板1. 函数模板概念2. 函数模板定义格式3. 函数模板原理4. 函数模板实例化5. 模板参数匹配原则 &#xff08;三&#xff09;类模板1…...

画立方体软件开发笔记 js three 投影 参数建模 旋转相机 @tarikjabiri/dxf导出dxf

gitee&#xff1a; njsgcs/njsgcs_3d mainwindow.js:4 Uncaught SyntaxError: The requested module /3dviewport.js does not provide an export named default一定要default吗 2025-05-10 14-27-58 专门写了个代码画立方体 import{ scene,camera,renderer} from ./3dviewp…...

LVGL图像导入和解码

LVGL版本&#xff1a;8.1 概述 在LVGL中&#xff0c;可以导入多种不同类型的图像&#xff1a; 经转换器生成的C语言数组&#xff0c;适用于页面中不常改变的固定图像。存储系统中的外部图像&#xff0c;比较灵活&#xff0c;可以通过插卡或从网络中获取&#xff0c;但需要配置…...

Win10无法上网:Windows 无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目找不到域 TEST 的域控制器DNS 解析存在问题

目录 一.先看问题 二.解决问题 三.补充备用 一.先看问题 Win08有网且已经加入域 Win10无网并且找不到域&#xff08;说明&#xff1a;Win10我之前已经加入过域的&#xff0c;并且能够上网&#xff0c;但每次在宿舍和教室切换校园网&#xff0c;就会导致只有Win10无网&#…...

开疆智能Canopen转Profinet网关连接工博士GBS20机器人配置案例

本案例是介绍将支持canopen通信协议的机器人机器人接入到西门子Profinet网络中&#xff0c;由于两种协议不能直接通讯&#xff0c;故选择了canopen转Profinet网关进行通讯协议转换。 配置过程&#xff1a; 首先打开Profinet主站配置软件&#xff0c;新建项目并导入网关GSD文件…...

物业企业绩效考核制度与考核体系

物业企业绩效考核制度旨在通过建立科学、公正的绩效管理体系,提升员工的工作效率、激发团队的潜力,并通过对绩效结果的合理运用来推动公司可持续发展。该制度覆盖了公司全体员工,并明确规定了不同岗位、不同部门的考核内容、周期以及绩效考核的标准操作流程。通过月度、季度…...

expo多网络请求设定。

在使用 npx expo start 启动 Expo 开发服务器时&#xff0c;你可以通过设置网络模式来控制你的应用如何连接到开发服务器。Expo 提供了几种网络模式供你选择&#xff1a; LAN (Default): 这是默认模式。在这种模式下&#xff0c;你的应用会通过本地局域网 (LAN) 连接到你的开发…...

M0基础篇之ADC

本节课使用到的例程 一、例程基本配置的解释 在例程中我们只使用到了PA25这一个通道&#xff0c;因此我们使用的是Single这个模式&#xff0c;也就是我们在配置模式的时候使用的是单一转换。 进行多个通道的测量我们可以使用Sequence这个模式。 二、例程基本代码讲解 DL_ADC12_…...

Cadence 高速系统设计流程及工具使用三

5.8 约束规则的应用 5.8.1 层次化约束关系 在应用约束规则之前&#xff0c;我们首先要了解这些约束规则是如何作用在 Cadence 设计对象上的。Cadence 中对设计对象的划分和概念&#xff0c;如表 5-11 所示。 在 Cadence 系统中&#xff0c;把设计对象按层次进行了划分&#…...

gitkraken 使用教程

一、安装教程 安装6.5.3&#xff0c;之后是收费的&#xff0c;Windows版免安装 二、使用教程 0. 软件说明 gitkraken是一个git本地仓库管理软件&#xff0c;可以管理多个仓库&#xff0c;并且仓库可以属于多个网站多个账户。 1. 克隆仓库 选择要克隆到什么位置&#xff0…...

抖音视频上传功能测试全维度拆解——从基础功能到隐藏缺陷的深度挖掘

一、核心功能测试&#xff08;Happy Path&#xff09; 文件基础验证 支持格式&#xff1a;MP4/MOV/AVI等&#xff08;含H.264/H.265编码组合验证&#xff09; 分辨率兼容性&#xff1a;720p→8K的渐进式测试&#xff08;重点验证竖屏9:16适配&#xff09; 时长边界&#xff1…...

基于PE环境搭建及调试S32K312

0、简介 本文基于S32K312 介绍PE的使用流程&#xff0c;主要是记录开发流程&#xff1a; MCU&#xff1a;NXP S32k312-100pin 编辑器&#xff1a;S32 Design Studio for S32 Platform 3.5 仿真器&#xff1a;PE USB Multilink Universal REV-E PE和jlink不一样&#xff0c…...

Autoware播放提示音

播放提示音 1、修改sound_player.yaml src/autoware/utilities/sound_player/scripts/sound_player.yaml start : ~/Autoware/install/sound_player/share/sound_player/start.wav stop : ~/Autoware/install/sound_player/share/sound_player/stop.wav red …...

学习黑客5 分钟深入浅出理解cron [特殊字符]

5 分钟深入浅出理解cron &#x1f552; 大家好&#xff01;今天我们将探索Linux系统中的cron——这个强大的定时任务调度工具&#xff0c;它允许用户自动执行周期性任务。在网络安全领域&#xff0c;尤其是在TryHackMe平台上的CTF挑战中&#xff0c;理解cron不仅是系统管理的基…...

Qt解决自定义窗口样式不生效问题

方法一&#xff1a; this->setAttribute(Qt::WA_StyledBackground, true); 方法二&#xff1a; 将类继承QWidget 改成继承 QFrame class MyWidget : public QFrame {} 方法三&#xff1a;重新实现QWidget的paintEvent函数时&#xff0c;使用QStylePainter绘制。 void p…...

redis未授权访问

redis是高速缓存型数据库&#xff0c;主要用户缓存一些频繁使用的数据来缓解数据库的访问压力。而redis未授权访问漏洞是因为redis数据库使用的过程中没有设定密码&#xff0c;任何人都可以直接连接数据库&#xff0c;这既是未授权访问&#xff0c;这是个通用漏洞&#xff0c;部…...

.Net HttpClient 使用准则

HttpClient 使用准则 System.Net.Http.HttpClient 类用于发送 HTTP 请求以及从 URI 所标识的资源接收 HTTP 响应。 HttpClient 实例是应用于该实例执行的所有请求的设置集合&#xff0c;每个实例使用自身的连接池&#xff0c;该池将其请求与其他请求隔离开来。 从 .NET Core …...

Eclipse 插件开发 6 右键菜单

Eclipse 插件开发 6 右键菜单 1 plugin.xml2 SampleHandler.java3 Activator.java 1 plugin.xml <?xml version"1.0" encoding"UTF-8"?> <?eclipse version"3.4"?> <plugin><!-- 定义命令 --><extension point&…...

MGP-STR:用于场景文本识别的多粒度预测

摘要 场景文本识别&#xff08;Scene Text Recognition&#xff0c;简称STR&#xff09;多年来一直是计算机视觉领域的研究热点。为了解决这一具有挑战性的问题&#xff0c;研究者们陆续提出了许多创新方法&#xff0c;近期将语言知识引入STR模型已成为一项重要趋势。在本研究…...

DAMA语境关系图汇总及考前须知

写在前面 1.考前须知 2.梳理彩色详细的语境关系图&#xff0c;方便理解与深化 1.考前须知 单选题10道题&#xff0c;每题1分&#xff0c;满分10分&#xff0c; 多选题15道题&#xff0c;每题2分&#xff0c;满分30分&#xff0c; 解答题6道&#xff0c;每题10分&#xff…...

Vue.js框架的优缺点

别再让才华被埋没&#xff0c;别再让github 项目蒙尘&#xff01;github star 请点击 GitHub 在线专业服务直通车GitHub赋能精灵 - 艾米莉&#xff0c;立即加入这场席卷全球开发者的星光革命&#xff01;若你有快速提升github Star github 加星数的需求&#xff0c;访问taimili…...

【Pandas】pandas DataFrame corr

Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...

【金仓数据库征文】金融行业中的国产化数据库替代应用实践

【引言】 随着国内技术的进步&#xff0c;越来越多的金融机构开始尝试将传统的商业数据库替换为国产化数据库。金仓数据库&#xff08;KingbaseES&#xff0c;简称KES&#xff09;凭借其高性能、稳定性和灵活的架构&#xff0c;逐步成为金融行业数据库替代的首选方案。本文将探…...

《基于人工智能的智能客服系统:技术与实践》

一、引言 在数字化时代&#xff0c;客户服务已成为企业竞争的关键领域之一。随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;智能客服系统逐渐成为企业提升服务质量和效率的重要工具。智能客服不仅能够快速响应客户咨询&#xff0c;还能通过自然语言处理&am…...

关于汇编语言与程序设计——单总线温度采集与显示的应用

一、实验要求 (1)握码管的使用方式 (2)掌握DS18B20温度传感器的工作原理 (3)掌握单总线通信方式实现 MCU与DS18B20数据传输 二、设计思路 1.整体思路 通过编写数码管显示程序和单总线温度采集程序&#xff0c;结合温度传感报警&#xff0c;利用手指触碰传感器&#xff0c;当…...

管道-验证和转换

管道-验证和转换 什么是管道管道的简单使用验证转换ParseIntPipeParseArrayPipe其他代码进度什么是管道 英雄联盟的老鼠说过一句话,条条管道通我家。管道一的脏水流到了管道二,管道二的脏水由于太脏了有杂物,堵住了去管道三的入口,所以通过不了(验证),去了管道四净化了下…...

多层嵌套子查询

在优化多层嵌套子查询的 Hive SQL 时&#xff0c;除了常见的谓词下推、分区裁剪、WITH 子句复用和动态分区优化&#xff0c;还可以通过 抽象语法树&#xff08;AST&#xff09;分析 和 基于历史的优化&#xff08;HBO&#xff09; 进一步优化。以下是结合所有技术方向的完整方案…...