二叉树的基本操作与实现:C语言深度剖析
目录
代码整体框架
1. #define _CRT_SECURE_NO_WARNINGS
2. 头文件引入
3. typedef int BTtype;
4. 二叉树节点结构体定义
二叉树的创建
1. BuyNode 函数
2. CreatNode 函数
二叉树的遍历
前序遍历
中序遍历
后序遍历
二叉树属性的计算
节点个数
1. 原静态变量 count 方式
2. 指针传递 count 方式
3. 优化后的递归方式
树的高度
1. 原高时间复杂度写法
2. 优化后写法
第K层节点个数
主函数与测试
在数据结构的领域中,二叉树是一种极为重要且基础的数据结构,它在许多算法和实际应用中都扮演着关键角色。本文将通过一段C语言代码,深入探讨二叉树的创建、遍历以及一些基本属性的计算。
作者主页:共享家9527-CSDN博客
代码整体框架
c#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int BTtype;typedef struct BTtree
{BTtype date;struct BTtree* left;struct BTtree* right;}BTNode;
1. #define _CRT_SECURE_NO_WARNINGS
- 原理:在使用Visual Studio等编译器时,为了增强代码安全性,一些传统的C函数(如 scanf 、 strcpy 等)会被视为不安全,并给出警告。这个宏定义的作用就是忽略这些关于函数安全性的警告。
- 作用:让开发者在使用这些传统函数时,代码编译过程更加简洁,避免大量警告信息干扰开发流程。
- 要点:虽然它方便了开发,但从安全角度考虑,在实际生产环境中,应尽量使用更安全的函数替代,如 scanf_s 、 strcpy_s 等。
2. 头文件引入
- stdio.h :提供标准输入输出函数,如 printf 用于输出信息, scanf 用于获取用户输入等。
- assert.h :包含断言机制, assert 宏用于在程序中插入调试断言。当断言条件为假时,程序会终止并给出错误信息,有助于在开发过程中快速定位逻辑错误。
- stdlib.h :包含一些标准的库函数,如动态内存分配函数 malloc 、 free ,以及数值转换函数等。在这里主要用于 malloc 为二叉树节点分配内存。
3. typedef int BTtype;
- 原理:使用 typedef 关键字为 int 类型定义一个别名 BTtype 。这样在后续代码中, BTtype 就等同于 int 。
- 作用:提高代码的可维护性和可读性。如果后续需要更改二叉树节点数据类型,只需要在这一处修改 typedef 定义即可,而不需要在整个代码中逐一修改 int 。
- 要点:使用别名时要确保其含义清晰,避免造成混淆。
4. 二叉树节点结构体定义
- 原理:定义了一个名为 BTNode 的结构体,包含一个数据成员 date 用于存储节点的数据,以及两个指针成员 left 和 right ,分别指向左子节点和右子节点。通过这种链式结构,构建出二叉树的层级关系。
- 作用:它是构建二叉树的基本单元,通过节点之间的指针连接,实现二叉树的各种操作,如遍历、插入、删除等。
- 要点:在操作节点时,要时刻注意指针的有效性,避免空指针引用等错误。
二叉树的创建
c// 申请一个新节点
BTNode* BuyNode(BTtype x)
{// 分配一个BTNode大小的内存块BTNode* node = (BTNode*)malloc(sizeof(BTNode));// 检查内存分配是否成功if (node == NULL){// 如果分配失败,打印错误信息perror("malloc fail");return;}// 初始化节点的数据为传入的值xnode->date = x;// 初始化左子节点指针为NULLnode->left = NULL;// 初始化右子节点指针为NULLnode->right = NULL;// 返回新创建的节点return node;
}// 创建一棵特定结构的二叉树
BTNode* CreatNode()
{// 创建节点1BTNode* node1 = BuyNode(1);// 创建节点2BTNode* node2 = BuyNode(2);// 创建节点3BTNode* node3 = BuyNode(3);// 创建节点4BTNode* node4 = BuyNode(4);// 创建节点5BTNode* node5 = BuyNode(5);// 创建节点6BTNode* node6 = BuyNode(6);// 设置节点1的左子节点为node2node1->left = node2;// 设置节点1的右子节点为node4node1->right = node4;// 设置节点2的左子节点为node3node2->left = node3;// 设置节点4的左子节点为node5node4->left = node5;// 设置节点5的右子节点为node6node5->right = node6;// 返回根节点return node1;
}
1. BuyNode 函数
- 原理:通过 malloc 函数从堆内存中分配一块大小为 sizeof(BTNode) 的内存空间,用于创建一个新的二叉树节点。分配成功后,对节点的数据成员和指针成员进行初始化,最后返回指向新节点的指针。
- 作用:为构建二叉树提供新的节点,是创建二叉树的基础操作。
- 要点:使用 malloc 后必须检查返回值是否为 NULL ,防止内存分配失败导致程序后续出现空指针错误。同时,当不再使用该节点时,要记得使用 free 释放内存,避免内存泄漏。
2. CreatNode 函数
- 原理:多次调用 BuyNode 函数创建多个节点,并通过手动设置每个节点的 left 和 right 指针,建立起节点之间的父子关系,从而构建出一棵具有特定结构的二叉树。
- 作用:快速构建一个用于测试和演示二叉树操作的示例树,方便后续对二叉树的遍历、属性计算等操作进行验证。
- 要点:构建过程中要确保节点之间的连接关系正确,否则会导致二叉树结构错误,影响后续操作的正确性。
二叉树的遍历
前序遍历
c// 前序遍历二叉树
void Preorder(BTNode* root)
{// 如果根节点为空,打印NULL并返回if (root == NULL){printf("NULL ");return;}// 先打印根节点的数据printf("%d ", root->date);// 递归前序遍历左子树Preorder(root->left);// 递归前序遍历右子树Preorder(root->right);
}
1. 原理:前序遍历按照“根 - 左 - 右”的顺序访问二叉树的节点。首先访问根节点,然后递归地对左子树进行前序遍历,最后递归地对右子树进行前序遍历。当遇到空节点( root == NULL )时,打印 NULL 并返回,以标记空节点位置,这有助于在输出中完整展示二叉树的结构。
2. 作用:常用于需要先处理根节点信息,再处理子树信息的场景。例如,在复制二叉树时,可以先复制根节点,再递归复制左右子树。
3. 要点:递归调用是实现前序遍历的关键,要确保递归的终止条件(即 root == NULL )正确,否则会导致栈溢出等错误。同时,由于是递归操作,要注意函数调用栈的深度限制。
中序遍历
c// 中序遍历二叉树
void Inorder(BTNode* root)
{// 如果根节点为空,打印NULL并返回if (root == NULL){printf("NULL ");return;}// 递归中序遍历左子树Inorder(root->left);// 打印根节点的数据printf("%d ", root->date);// 递归中序遍历右子树Inorder(root->right);
}
1. 原理:中序遍历按照“左 - 根 - 右”的顺序访问二叉树节点。先递归地对左子树进行中序遍历,然后访问根节点,最后递归地对右子树进行中序遍历。对于二叉搜索树,中序遍历会按照从小到大的顺序输出节点的值,这是由二叉搜索树的特性决定的(左子树节点值小于根节点值,右子树节点值大于根节点值)。
2. 作用:在二叉搜索树中,中序遍历可以用于按顺序获取树中的所有元素,常用于数据排序展示或查找特定元素的场景。
3. 要点:同样要注意递归的终止条件。在处理二叉搜索树时,利用中序遍历的有序性可以优化一些查找和比较操作,但对于普通二叉树,中序遍历的顺序并无特定规律。
后序遍历
c// 后序遍历二叉树
void Postorder(BTNode* root)
{// 如果根节点为空,打印NULL并返回if (root == NULL){printf("NULL ");return;}// 递归后序遍历左子树Postorder(root->left);// 递归后序遍历右子树Postorder(root->right);// 打印根节点的数据printf("%d ", root->date);
}
1. 原理:后序遍历按照“左 - 右 - 根”的顺序访问二叉树节点。先递归地对左子树进行后序遍历,然后递归地对右子树进行后序遍历,最后访问根节点。这种遍历方式在一些需要先处理完子树所有节点,再处理根节点的场景中非常有用,比如计算树的高度、释放树的内存等。
2. 作用:在计算二叉树的一些属性(如节点个数、高度)时,后序遍历可以确保先获取子树的相关信息,再根据子树信息计算根节点的属性。在释放二叉树内存时,后序遍历可以先释放子树节点内存,最后释放根节点内存,避免内存泄漏和悬空指针问题。
3. 要点:递归实现时注意终止条件和函数调用栈深度。在进行内存释放等操作时,要确保所有节点都能被正确释放,避免内存管理错误。
二叉树属性的计算

节点个数
c// 计算二叉树的节点个数
// 原先是用静态变量count来计数,但是有局限性,比如多次调用会累计计数,与实际不符
// 改进版本是通过指针传递count,虽然解决了累计计数问题,但代码稍显繁琐
// 最终优化为以下递归方式,简洁且高效
int testsize(BTNode* root)
{// 如果根节点为空,返回0,否则递归计算左右子树节点个数并加上根节点本身return root == NULL? 0 : testsize(root->left) + testsize(root->right) + 1;
}
1. 原静态变量 count 方式
- 原理:使用静态变量 count ,在递归遍历二叉树的过程中,每访问一个节点就将 count 加1。由于静态变量的生命周期是整个程序运行期间,且只初始化一次,所以在多次调用计算节点个数的函数时, count 会累计计数,而不是针对每次传入的二叉树独立计算。
- 局限性:无法准确计算每次传入的二叉树的节点个数,特别是在多次调用该函数计算不同二叉树节点个数时,结果会出错。
2. 指针传递 count 方式
- 原理:通过传入一个指向 count 变量的指针,在递归遍历过程中,每次访问节点时,通过指针修改 count 的值( ++(*count) )。这样在不同的函数调用中,可以使用不同的 count 变量,解决了静态变量累计计数的问题。
- 缺点:代码实现相对繁琐,需要额外处理指针的传递和操作,增加了代码的复杂性和出错的可能性。
3. 优化后的递归方式
- 原理:利用递归的思想,对于空树( root == NULL ),节点个数为0;对于非空树,节点个数等于左子树节点个数加上右子树节点个数再加上根节点本身(即1)。通过递归调用自身,不断分解问题,直到处理到空树,从而得到整棵树的节点个数。
- 优点:代码简洁明了,逻辑清晰,避免了静态变量的局限性和指针传递的复杂性,是一种高效且优雅的实现方式。
树的高度
c// 计算二叉树的高度
// 之前的写法虽然逻辑正确,但是时间复杂度为N^2,因为每次比较大小都要重新计算子树高度
// 优化后的代码先计算左右子树高度,再比较,时间复杂度降为N
int treehigh(BTNode* root)
{// 如果根节点为空,返回0if (root == NULL)return 0;// 计算左子树高度int left = treehigh(root->left);// 计算右子树高度int right = treehigh(root->right);// 返回左右子树中较大高度加1(加上根节点这一层)return left > right? left + 1 : right + 1;
}
1. 原高时间复杂度写法
- 原理:每次计算树的高度时,先分别递归计算左子树和右子树的高度,然后比较两者大小,取较大值加1作为树的高度。然而,在比较大小时,每次都要重新递归计算左子树和右子树的高度,导致大量重复计算。
- 时间复杂度分析:由于每次比较都要重新计算子树高度,对于有 N 个节点的二叉树,计算高度的时间复杂度为 O(N^2) ,效率较低。
2. 优化后写法
- 原理:先分别计算左子树和右子树的高度,并将结果存储在 left 和 right 变量中。然后比较这两个变量的值,取较大值加1作为树的高度。这样每个子树的高度只计算一次,避免了重复计算。
- 时间复杂度分析:对于每个节点,只需要计算一次其左右子树的高度,所以时间复杂度为 O(N) ,其中 N 是二叉树的节点个数,大大提高了计算效率。
第K层节点个数
c// 计算二叉树第k层的节点个数
int treeKlevel(BTNode* root, int k)
{// 如果根节点为空,返回0if (root == NULL)return 0;//如果k等于1,说明当前节点就是第k层,返回1if (k == 1)return 1;// 递归计算左子树中第k - 1层的节点个数int leftk = treeKlevel(root->left, k - 1);// 递归计算右子树中第k - 1层的节点个数int rightk = treeKlevel(root->right, k - 1);//返回左右子树中第k - 1层节点个数之和return leftk + rightk;
}
1. 原理:采用递归的方法计算第 k 层节点个数。如果根节点为空,说明树为空,第 k 层节点个数为0。当 k 等于1时,当前节点就是第 k 层,返回1。对于 k > 1 的情况,通过递归分别计算左子树和右子树中第 k - 1 层的节点个数,然后将这两个结果相加,得到整棵树第 k 层的节点个数。
2. 作用:用于获取二叉树中特定层的节点数量,在一些需要按层处理二叉树数据的算法中非常有用,比如层序遍历的优化、按层统计节点信息等。
3. 要点:递归的终止条件很关键, root == NULL 和 k == 1 这两个条件确保了递归能够正确结束,避免无限递归。同时,要理解递归过程中 k 值的变化,以及如何通过子树的第 k - 1 层节点个数推导出整棵树第 k 层的节点个数。
主函数与测试
cint main()
{// 创建二叉树BTNode* root = CreatNode();// 前序遍历并输出Preorder(root);printf("\n");// 中序遍历并输出Inorder(root);printf("\n");// 后序遍历并输出Postorder(root);printf("\n");// 计算并输出二叉树的节点个数printf("Size:%d", testsize(root));printf("\n");// 计算并输出二叉树的高度,这里减1是因为代码中高度计算包含根节点,而实际概念中根节点算第1层printf("High:%d", treehigh(root) - 1);return 0;
}
1. 创建二叉树:调用 CreatNode 函数创建一棵特定结构的二叉树,并将返回的根节点指针存储在 root 变量中。这是后续对二叉树进行各种操作的基础。
2. 遍历操作:分别调用 Preorder 、 Inorder 和 Postorder 函数对二叉树进行前序、中序和后序遍历,并将遍历结果输出到控制台后,这一系列操作的意义和作用十分关键。通过输出遍历结果,开发者能够直观地验证二叉树的结构是否符合预期,以及遍历函数的实现是否正确。
- 前序遍历结果分析:前序遍历按照“根 - 左 - 右”的顺序访问节点。输出的结果顺序能够反映出二叉树从根节点开始,逐层向左子树和右子树扩展的访问路径。如果二叉树的构建正确,前序遍历结果中,根节点总是第一个被输出,然后是左子树的节点,按照相同的前序规则依次输出,最后是右子树的节点。通过观察前序遍历结果,我们可以检查节点之间的父子关系是否正确建立,以及整个遍历过程是否符合前序遍历的逻辑。
- 中序遍历结果分析:对于普通二叉树,中序遍历结果呈现出一种从左到右逐步深入的节点访问顺序。而对于二叉搜索树,中序遍历的结果应该是一个有序序列。在这个测试中,通过输出中序遍历结果,我们可以验证二叉树是否满足二叉搜索树的特性(如果它本应是一棵二叉搜索树的话)。即使不是二叉搜索树,中序遍历结果也能帮助我们了解节点在左子树和右子树之间的分布情况,以及整个树的中序遍历逻辑是否正确实现。
- 后序遍历结果分析:后序遍历按照“左 - 右 - 根”的顺序访问节点。输出的后序遍历结果中,根节点总是最后一个被输出,这符合后序遍历先处理子树再处理根节点的特性。通过分析后序遍历结果,我们可以检查在处理复杂的二叉树结构时,是否能够正确地先完成子树的遍历,再处理根节点,确保整个遍历过程的正确性和完整性。
3. 计算并输出二叉树的节点个数:调用 testsize 函数计算二叉树的节点个数,这个函数采用递归方式,简洁高效地完成了计算任务。然后通过 printf 函数将节点个数输出,格式化为“Size:[节点个数]”,方便直观地查看结果。
4. 计算并输出二叉树的高度:调用 treehigh 函数计算二叉树的高度,在代码实现中,树的高度计算是从0开始计数(根节点高度计为0,根节点的子节点高度计为1,以此类推),但在通常的二叉树高度概念中,根节点所在层算第1层 ,所以需要将 treehigh 函数返回的值减1后再输出。通过 printf 函数将高度值输出,格式化为“High:[高度值]”。
5. 返回值: main 函数返回0,表示程序正常结束。在C语言中, main 函数的返回值用于向操作系统传递程序的结束状态,0通常表示程序执行过程中没有出现错误。
通过 main 函数中的这些操作,可以对之前定义的二叉树创建、遍历以及属性计算等功能进行全面的测试和验证,确保代码的正确性和可靠性。
相关文章:
二叉树的基本操作与实现:C语言深度剖析
目录 代码整体框架 1. #define _CRT_SECURE_NO_WARNINGS 2. 头文件引入 3. typedef int BTtype; 4. 二叉树节点结构体定义 二叉树的创建 1. BuyNode 函数 2. CreatNode 函数 二叉树的遍历 前序遍历 中序遍历 后序遍历 二叉树属性的计算 节点个…...
【人工智能】Deepseek 与 Kimi 联袂:重塑 PPT 创作,开启智能演示新纪元
我的个人主页 我的专栏:人工智能领域、java-数据结构、Javase、C语言,希望能帮助到大家!!!点赞👍收藏❤ 前言 在当今快节奏的工作与学习场景中,PPT 制作常常是一项耗时耗力的任务。从前期的资…...
Nest系列:NestJS 中 Logger 完全指南:从基础到企业级实践-04
一、Logger 的核心价值 在服务端应用中,日志系统承担着三大核心职责: 系统监控:实时反馈应用健康状态问题追踪:快速定位异常根源行为审计:记录关键业务操作NestJS 内置的日志系统提供了开箱即用的解决方案,支持: ✅ 多日志级别管理 ✅ 上下文感知日志 ✅ 自定义输出格式…...
行为模式---模版模式
概念 模版模式是设计模式行为模式的一种,它的核心思想是定义一个算法骨架,将某些步骤提取到到子类中实现。解决当项目中出现多个处理分支,这几个处理分支有重复步骤的时实现代码的复用和扩展。在这种模式下不用修改逻辑结构,使用…...
C++博客分享
本周的一些 C视频分享, 或许后续会做一些内容总结. 博客 Polymorphic, Defaulted EqualityConstexpr factors_ofC26: Removing language featuresBypassing the branch predictor Meeting C 2024 Clean CMake for C (library) developers - Kerstin KellerAn Introduction …...
Cesium 入门教程(基于 vue3)
目录 Cesium 介绍: 下载 Cesium,2种路径: 下载成功后,创建 vue3 项目: 编写内容 一个“纯”地球 添加图层 坐标系及其数值转换 相机位置及动态交互 添加物体和3维建筑物 Cesium 介绍: Cesium 是一个开源的 JavaScript …...
Power Apps 技术分享:连接SharePoint列表数据源
前言 在使用Power Apps的时候,使用列表作为数据源是非常方便和经济的,列表创建简单,SharePoint的存储也不像Dataverse需要按照容量付费。 正文 1.我们先在SharePoint中建一个列表,添加一些测试数据,如下图:…...
Flutter FloatingActionButton 从核心用法到高级定制
目录 1. 引言 2. FloatingActionButton 的基本用法 3. 主要属性 4. 进阶定制技巧 4.1 扩展型 FAB 4.2 动态变形动画 4.3 多个 FAB 协同 5. 主题与动效集成 5.1 全局主题配置 5.2 平台适配方案 5.3 高级动画控制器 6. 最佳实践 6.1 布局规范 6.2 性能优化 6.3 无…...
42、【OS】【Nuttx】【OSTest】内存监控:堆空间初始化
背景 接上篇blog 41、【OS】【Nuttx】【OSTest】内存监控:堆空间申请 分析了堆空间的申请,下面分析堆管理器如何初始化申请后的堆空间 用户堆空间初始化 回到 umm_initialize 函数,之前 blog 40、【OS】【Nuttx】【OSTest】内存监控&#…...
STM32---FreeRTOS消息队列
一、简介 1、队列简介: 队列:是任务到任务,任务到中断、中断到任务数据交流的一种机制(消息传递)。 FreeRTOS基于队列,实现了多种功能,其中包括队列集、互斥信号量、计数型信号量、二值信号量…...
Web前端开发——CSS入门
CSS入门 一、CSS是什么?二、CSS的基本语法三、如何使用CSS1. 内联样式2. 内部样式表3. 外部样式表 四、CSS选择器1. 元素选择器2. 类选择器3. ID选择器 五、CSS的常用属性1. 文本样式2. 布局3. 背景 一、CSS是什么? CSS(Cascading Style She…...
C#核心笔记——(五)框架概述
.NET Ftamework中几乎所有功能都是通过大量的托管类型提供的。这些类型组织在层次化的命名空间中,并打包为一套程序集,与CLR一起构成了.NET平台。 有些.NET类型是由CLR直接使用的,且对于托管宿主环境而言是必不可少的。这些类型位于一个名为…...
前端---CSS(前端三剑客)
1.基本语法规范 选择器 {⼀条/N条声明} • 选择器决定针对谁修改 (找谁) • 声明决定修改啥. (⼲啥) • 声明的属性是键值对. 使⽤ ; 区分键值对, 使⽤ : 区分键和值 比如: <!DOCTYPE html> <html lang"en"> <head><meta…...
JS基础部分
引入方式 内部脚本 外部脚本 变量 使用let声明变量,弱类型,使用const声明常量 因为箭头函数中this指针有问题,会默认指向父级对象 DOM 文档对象模型,将标记语言的各个部分封装成对应的对象。js通过dom就能够对html进行操作 …...
五大基础算法——模拟算法
模拟算法 是一种通过直接模拟问题描述的过程或规则来解决问题的算法思想。它通常用于解决那些问题描述清晰、步骤明确、可以直接按照规则逐步实现的问题。以下是模拟算法的核心概念、适用场景、实现方法及经典例题: 一、核心概念 问题描述清晰 问题的规则和步骤明确…...
蓝桥杯学习-12递归
12递归 1.概述 2.几个递归模板 (1)求阶乘 int f(int n){ if(n 1) return 1; return f(n-1) * n; }(2)斐波拉契序列 int f(int n){ if(n 1 || n 2) return n; return f(n - 1) f(n - 2); }例题一-蓝桥5194 int f(int n){if(n 0) return 1;if(n % 2 0) return f(n / 2)…...
K8S的搭建
一。关闭防火墙和SELinux 1.1systemctl stop firewalld 1.2setenfoce 0 二。配置内核转发以及网桥过滤 2.1vi /etc/sysctl.d/k8s.conf 2.2sysctl -p /etc/sysctl.d/k8s.conf :让文件生效 2.3modprobe br_netfilter:加载模块 三。启动ipvsÿ…...
Python学习第十八天
Django模型 定义:模型是 Django 中用于定义数据库结构的 Python 类。每个模型类对应数据库中的一张表,类的属性对应表的字段。 作用:通过模型,Django 可以将 Python 代码与数据库表结构关联起来,开发者无需直接编写 S…...
Linux 命令学习记录
Linux 命令详解与进阶指南 Linux 是一种广泛使用的开源操作系统,掌握 Linux 命令是开发者和系统管理员的必备技能。本文将详细介绍 Linux 的常用命令,并涵盖一些高级进阶技巧,帮助你更高效地使用 Linux。 目录 基础命令 文件与目录操作文本…...
Python中的uv run时,--with参数的作用
在Python生态中,工具链的效率和场景适应性始终是开发者关注的焦点。UV工具链的uv run命令不仅继承了Rust的高性能基因,其--with参数更是将临时依赖管理提升到全新维度。本文将深度解析这一核心参数的原理与应用场景。 一、–with参数的技术突破 1. 功能本质 --with参数实现…...
【算法学习之路】10.二叉树
二叉树 前言一.简介二.题目123 前言 我会将一些常用的算法以及对应的题单给写完,形成一套完整的算法体系,以及大量的各个难度的题目,目前算法也写了几篇,题单正在更新,其他的也会陆陆续续的更新,希望大家点…...
【大模型实战篇】使用GPTQ量化QwQ-32B微调后的推理模型
1. 量化背景 之所以做量化,就是希望在现有的硬件条件下,提升性能。量化能将模型权重从高精度(如FP32)转换为低精度(如INT8/FP16),内存占用可减少50%~75%。低精度运算(如INT8…...
点灯、点各式各样的灯
鱼离水则身枯,心离书则神索。 前言闪灯呼吸灯流水灯二进制数显示灯蜂鸣器节拍流水音乐会总结 前言 上回书咱们简单了解了一点有关特殊功能寄存器sfr、通用输入输出GPIO、位操作运算符sbit和一个不靠单片机上的晶振(拿来定时的)的依托于单片机CPU空操作的ms级延时函…...
关于修改 Ollama 及其模型默认路径、迁移已安装的 Ollama 程序和模型以及重启 Ollama 的操作指南
以下是关于修改 Ollama 及其模型默认路径、迁移已安装的 Ollama 程序和模型以及重启 Ollama 的操作指南,以问答格式呈现,并将涉及命令操作的部分使用代码块按执行顺序和步骤形式展示: Q1:如何修改 Ollama 及其模型的默认路径&…...
《C#上位机开发从门外到门内》3-3:基于USB的设备管理系统
文章目录 **1. 项目概述****1.1 项目背景****1.2 项目目标****1.3 技术栈** **2. 系统架构设计****2.1 系统架构图****2.2 模块功能** **3. 设备控制模块实现****3.1 USB通信简介****3.2 设备控制流程****3.3 代码实现** **4. 设备状态监测模块实现****4.1 设备状态监测流程***…...
Matlab 风力发电机磁悬浮轴承模型pid控制
1、内容简介 略 Matlab 174-风力发电机磁悬浮轴承模型pid控制 可以交流、咨询、答疑 2、内容说明 磁悬浮轴承具有无接触、无摩擦、高速度、高精度、能耗低、不需要需润滑无油污染、可靠性高、寿命长和密封等一系列显著的优点。将磁悬浮技术应用于风力发电机中可以降低风机切入…...
大模型-提示词调优
什么是提示词 提示词(Prompt)在大模型应用中扮演着关键角色,它是用户输入给模型的一段文本指令 。简单来说,就是我们向大模型提出问题、请求或描述任务时所使用的文字内容。例如,当我们想让模型写一篇关于春天的散文&a…...
[RN 实践有效]Expo+cross-env配置项目环境变量
首先,从中可以看出,cross-env的主要作用是跨平台设置环境变量,而Expo项目通常通过app.config.js或.env文件来管理这些变量。需要强调安装cross-env的必要性,以及如何在package.json中正确配置脚本命令。 接下来,用户的问题是关于Expo中cross-env的详细配置,因此需要分步骤…...
【C语言】编译和链接详解
hi,各位,让我们开启今日份博客~ 小编个人主页点这里~ 目录 一、翻译环境和运行环境1、翻译环境1.1预处理(预编译)1.2编译1.2.1词法分析1.2.2语法分析1.2.3语义分析 1.3汇编1.4链接 2.运行环境 一、翻译环境和运行环境 在ANSI C…...
CSS引入方式、字体与文本
目录 前言 一、CSS引入方式 1.内联样式(Inline Style) 2.内部样式表(Internal Style Sheet) 3.外部样式表(External Style Sheet) 4.导入样式表(import) 5.引入方式对比 6.总…...
2.机器学习-回归模型-非线性模型
一.决策树回归 1.决策树的核心参数: (1)树的生长与分裂 参数名默认值作用criterion"squared_error"分裂节点的评估标准: - "squared_error":均方误差(MSE)。 - "friedman_mse":改进的…...
Git提交前时间检查
为了防止在本地看日志的时候,由于本地时间被修改,导致日志的时间存在非正确时间。通过以下脚本在提交前进行时间验证,只有是正确的时间才可以提交。 使用方法如下: 复制如下脚本,命名为 pre-commit ,放到 …...
浅述WinForm 和 WPF 的前景
在.NET 开发领域,WinForm 和 WPF 都是用于创建桌面应用程序的技术框架,但它们在很多方面存在差异,对于开发者来说,也常常会思考哪个更有前途。 一、WinForm 1. 成熟/稳定度: WinForms 是较早的桌面应用程序框架&am…...
【从零开始学习计算机科学】设计模式(二)工厂模式、抽象工厂模式、单例模式、建造者模型、原型模式
【从零开始学习计算机科学】设计模式(二)工厂模式、抽象工厂模式、单例模式、建造者模型、原型模式 工厂模式主要特点类型适用场景抽象工厂模式主要特点工作原理适用场景举例优点缺点总结单例模式主要特点工作原理适用场景优点缺点总结建造者模式主要特点工作原理适用场景优点…...
超精密工件小孔几何尺寸测量:自动化解决方案
下载链接:(最新版本)超精密工件小孔几何尺寸测量:自动化解决方案python脚本代码,可直接运行,内包含测试数据,亲测好用资源-CSDN文库 在现代制造业中,超精密工件的质量控制至关重要&a…...
Mastering SAP Analytics Cloud - Empower Your Business Users
Mastering SAP Analytics Cloud - Empower Your Business Users...
Hadoop、Spark、Flink Shuffle对比
一、Hadoop的shuffle 前置知识: Map任务的数量由Hadoop框架自动计算,等于分片数量,等于输入文件总大小 / 分片大小,分片大小为HDFS默认值128M,可调 Reduce任务数由用户在作业提交时通过Job.setNumReduceTasks(int)设…...
Sublime Text 2.0.2 安装与汉化指南:从下载到中文包配置的完整教程
Sublime Text 是一款轻量级、高性能的代码编辑器,深受开发者喜爱。Sublime Text 2.0.2 是一个较旧的版本,但仍然可以满足基本的代码编辑需求。以下是关于 Sublime Text 2.0.2 的安装、中文包配置以及使用方法的详细指南。 1. 下载 Sublime Text 2.0.2 提…...
【双指针】移动零
题目描述: 算法分析: 观察输入输出: 输出中一共分为两个区域,0区和非零区。 但是在处理未完成之前,必然存在着一个零和非零数共存的区域,所以在处理的过程当中一共有三个区域,0区,…...
CMake简单入门
简介 CMake 是一个开源的跨平台构建系统生成工具,旨在简化和自动化项目的构建过程。它主要用于管理和控制软件构建的过程,特别是在处理复杂的项目结构和多个平台时。CMake 并不直接进行编译或链接,而是生成本地构建系统所需的文件࿰…...
【AIGC】OpenAI 集成 Langchain 操作实战使用详解
目录 一、前言 二、前置准备 2.1 安装 Langchain必须的依赖 2.1.1 python环境 2.1.2 langchain openai 环境 2.1.3 准备一个apikey 2.1.4 langchain 核心组件 三、Langchain 各组件使用 3.1 Chat models组件 3.1.1 Invocation 使用 3.1.1.1 结果解析 3.2 提示词模板…...
热key探测技术架构设计与实践
参考: 得物热点探测技术架构设计与实践 Redis数据倾斜与JD开源hotkey源码分析揭秘 京东热点检测 HotKey 学习笔记 hotkey: 京东App后台中间件,毫秒级探测热点数据,毫秒级推送至服务器集群内存,大幅降低热key对数据层查询压力 …...
【最新】 ubuntu24安装 1panel 保姆级教程
系统:ubuntu24.04.1 安装软件 :1panel 第一步:更新系统 sudo apt update sudo apt upgrade 如下图 第二步:安装1panel,运行如下命令 curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o …...
微信小程序threejs三维开发
微信小程序threejs开发 import * as THREE from three; const { performance, document, window, HTMLCanvasElement, requestAnimationFrame, cancelAnimationFrame, core, Event, Event0 } THREE .DHTML import Stats from three/examples/jsm/libs/stats.module.js; im…...
Starship:快速且高度可定制的命令行框架!!
Starship 是一款专为开发者设计的现代、快速且高度可定制的命令行框架。它通过简洁的界面提供丰富的环境信息,帮助用户更高效地进行日常开发工作。 软件介绍: Starship 是用 Rust 编写的开源项目,以其轻量级和极速启动而著称。它能够跨平台运…...
流水线(Pipeline)
在现代 CPU 设计中,流水线(Pipeline) 是将指令处理拆分为多个阶段以提高执行效率的关键技术。为了更精细地分析性能,流水线通常被分为 前端流水线(Frontend Pipeline) 和 后端流水线(Backend Pi…...
Symbian(塞班)操作系统
Symbian(塞班)是由多家通信巨头联合开发的专为移动设备设计的操作系统,曾是全球智能手机市场的早期主导者。以下是其核心定义与技术特点的整合分析: 一、定义与起源 系统定位 Symbian是由英国Psion公司的EPOC操作系统演变而来…...
CSS -属性值的计算过程
目录 一、抛出两个问题1.如果我们学过优先级关系,那么请思考如下样式为何会生效2.如果我们学习过继承,那么可以知道color是可以被子元素继承使用的,那么请思考下述情景为何不生效 二、属性值计算过程1.确定声明值2.层叠冲突3.使用继承4.使用默…...
施磊老师c++(七)
STL组件 文章目录 STL组件1.整体学习内容2.vector容器3.deque和listdeque--双端队列容器list--链表容器 4.vector,deque,list对比主要内容面经问题 5.详解容器适配器--stack, queue, priority_queue容器适配器stack-栈queue-队列priority_queue-优先级队列总结 6.无序关联容器关…...
Codeforces 158B. Taxi
题目 题目链接:https://codeforces.com/problemset/problem/158/B time limit per test:3 seconds;memory limit per test:256 megabytes After the lessons n groups of schoolchildren went outside and decided to visit Polycarpus to celebrate his birthda…...