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

二叉树路径相关算法题|带权路径长度WPL|最长路径长度|直径长度|到叶节点路径|深度|到某节点的路径非递归(C)

带权路径长度WPL

二叉树的带权路径长度(WPL)是二叉树所有叶节点的带权路径长度之和,给定一棵二叉树T,采用二叉链表存储,节点结构为
在这里插入图片描述

其中叶节点的weight域保存该节点的非负权值,设root为指向T的根节点的指针,设计求WPL的算法

算法思想

![[Pasted image 20241120144005.png]]

方法1,树中全部叶节点的带权路径长度之和
采用递归思想
二叉树的WPL值 = 树中全部叶节点的带权路径长度之和 = 根节点左子树中全部叶节点的带权路径长度之和 + 根节点右子树中全部叶节点的带权路径长度之和
叶节点的带权路径长度 = 该节点的weight域的值 x 该节点的深度
设根节点的深度为0,若某节点的深度为d,其子节点的深度为d+1
递归过程中,如果遍历到叶节点,返回该节点的带权路径长度,否则返回其左右子树的带权路径长度之和

先遍历5,d是0,不是叶子节点,递归3和7,d为1,3不是叶子节点,7是叶子节点,返回1x7,再递归1和4,d为2,都是叶子节点,返回1x2和4x2,所以WPL为2+8+7=17

typedef struct node
{int weight;struct node *left, *right;
}BTNode;// 传入根节点,调用递归函数,初始深度d为0
int WPL(BTNode* root)
{return WPL1(root, 0);
}// 传入节点和该节点的深度
int WPL1(BTNode* root, int d)
{// 如果该节点是叶子节点,返回该叶子节点的weightxd,也就是带权路径长度if (root->left == NULL && root->right == NULL)return (root->weight * d);// 否则递归该节点的左孩子和右孩子,子节点的深度为根节点的深度+1elsereturn (WPL1(root->left, d + 1) + WPL1(root->right, d + 1));
}

WPL1是一个递归函数,用来计算从当前节点开始的WPL

最长路径长度

给定一个二叉树的root,返回最长的路径的长度,这个路径中的每个节点具有相同值。这条路径可以经过也可以不经过根节点。两个节点之间的路径的长度由它们之间的边数表示

算法思想

符合要求的左子树路径最大长度leftpath,符合要求的右子树路径最大长度rightpath,最后的路径长度为当前路径,与rightpath+leftpath最大值,注意全局变量的初始化位置
![[Pasted image 20241120204702.png]]

第一层
递归计算root的左右孩子的最长单向路径
右节点存在且与当前节点值相等,都是5
rightpath = right+1
![[Pasted image 20241120205655.png]]

第二层
right是右节点的DFS返回的值;
递归计算这个节点的左右孩子的最长单向路径,
同样右节点存在且与当前值相等,都是5
rightpath = right+1
![[Pasted image 20241120205727.png]]

第三层
right是右孩子返回的值,
递归左右孩子,为空,返回0
left和right都是0,path也是0,最后返回0
返回第二层
right是0,rightpath是1,path更新为1,返回1
返回第一层
right是1,rightpath是2,path更新为2,返回2

int path;   // 全局变量,用于存储当前发现的最长路径长度
// 返回两个正数中的较大值
int Max(int a, int b)
{return a >= b ? a : b;
}
// 递归地计算以root为根的子树中,以相同节点值构成的最长路径
int DFS(BTNode* root)
{// 如果当前节点为空,返回0,因为没有路径if (root == NULL)return 0;int left;int right;int leftpath = 0;int rightpath = 0;// 递归计算左子树和右子树的最长单向路径// left是左子树的最长路径,right是右子树的最长路径left = DFS(root->left);right = DFS(root->right);// 如果左节点存在且与当前节点值相等,最长路径+1if ((root->left) && (root->left->val == root->val))leftpath = left + 1;// 如果右节点存在且与当前节点值相等,最长路径+1if ((root->right) && (root->right->val == root->val))rightpath = right + 1;// leftpath+rightpath,当前节点处的最长路径的长度,经过当前节点// 更新pathpath = Max(path, leftpath + rightpath);// 返回从当前节点向下延伸的最长单项路径,用于供上层节点继续计算return Max(leftpath, rightpath);
}
int longestUnivaluePath(BTNode* root)
{if (root == NULL)return 0;path = 0;DFS(root);return path;
}

直径长度

给定一个二叉树,计算它的直径长度。一棵二叉树的直径长度是任意两个节点路径长度中的最大值。这条路径可能穿过也可能不穿过根节点

算法思想

递归求得节点的左子树的最大深度和右子树的最大深度,相加便是经过该节点的直径,遍历每个节点,更新最大值便可得到该二叉树的最大直径。

  1. 写出一个求树的最大深度的函数
  2. 递归调用这个函数,求得每个节点的左子树最大深度和右子树最大深度,相加

![[Pasted image 20241120211158.png]]

第一层
将rootA传入depth求深度,传入sum记录直径
递归计算左右子树B和C的深度
第二层
B继续递归左右子树的深度,D和F
C为叶子节点,没有左右孩子,left和right为0,new也就是直径为1,sum更新为1,返回深度为1
第三层
D为叶子节点,new为1,sum还是1,返回深度为1
F为叶子节点,new为1,sum还是1,返回深度为1
返回第二层
B,的left和right都是1,B的new也就是直径是3,sum更新为3,返回深度为2
返回第一层
A,left为2,right为1,new也就是直径为4,sum更新为4,返回深度为3
最后sum=4,返回sum-1 = 3

// 返回两个整数中的较大值
int max(int a, int b)
{return a > b ? a : b;
}// 递归计算二叉树的深度,同时更新全局变量记录直径
int depth(BTNode* root, int* sum)
{// 如果当前节点为空,返回深度为0if (root == NULL)return 0;// 左子树的最大深度int left = depth(root->left, sum);// 右子树的最大深度int right = depth(root->right, sum);// 经过根节点的直径,左子树最大深度与右子树最大深度之和int new = left + right + 1;// 更新sum,记录到目前为止的最大直径*sum = max(*sum, new);// 返回该节点深度的最大值,等于左右子树的最大深度+1return max(left, right) + 1;
}int dimeterBT(BTNode* root)
{if (root == NULL)return 0;int sum = 0;depth(root, &sum);// 返回sum-1,将节点数转换为边数作为直径的定义return sum - 1;
}

到叶节点路径

给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径

算法思想

深度优先遍历二叉树,要考虑当前节点以及它的孩子节点,如果当前节点不是叶子节点,则在当前的路径末尾添加该节点,并继续递归遍历该节点的每一个孩子节点
如果当前节点是叶子节点,则在当前路径末尾添加该节点后就得到了从根节点到叶子节点的路径
![[Pasted image 20241121142757.png]]

将根节点的值1,入到stack深度下标的位置上,深度为0
![[Pasted image 20241121142855.png]]

有左右孩子,先递归左孩子,深度+1=1
2,入栈
![[Pasted image 20241121143227.png]]

有右孩子,递归右孩子,5入栈,depth为2
![[Pasted image 20241121143316.png]]

这时候左右孩子节点都为空
将1->2->5的路径保存

  • 动态分配一个字符串缓冲区tmp。用于存储当前路径的字符串
    1001是缓冲区的长度
  • len=0,记录路径字符串的当前长度,即字符串的写入位置,起始为0,表示字符串从头开始写入
  • 遍历当前路径中的所有节点值,即stack;使用sprintf追加到路径字符串tmp中
  • 添加叶节点值,在路径字符串的末尾,添加当前叶子节点的值
  • 将路径字符串存储到结果数组

返回1节点,递归右孩子3,深度为1,入栈,会覆盖掉2,变成3

// 定义二叉树节点结构 
typedef struct node 
{ int val; struct node* left; struct node* right; 
} BTNode; // 辅助函数:递归生成路径 
void generatePaths(BTNode* root, char** paths, int* returnSize, int* stack, int depth) 
{ if (root == NULL) return; // 将当前节点加入路径栈 stack[depth] = root->val; // 如果是叶子节点,生成路径字符串 if (root->left == NULL && root->right == NULL) { // 分配路径字符串 char* tmp = (char*)malloc(1001); int len = 0; // 构建路径字符串 for (int i = 0; i < depth; i++) { len += sprintf(tmp + len, "%d->", stack[i]); } // 添加叶子节点值 sprintf(tmp + len, "%d", root->val); // 将路径存储到结果数组 paths[(*returnSize)++] = tmp; return; } // 递归遍历左、右子树 generatePaths(root->left, paths, returnSize, stack, depth + 1); generatePaths(root->right, paths, returnSize, stack, depth + 1); 
} // 主函数:生成所有路径 
char** binaryTreePaths(BTNode* root, int* returnSize) 
{ // 分配结果数组 char** paths = (char**)malloc(sizeof(char*) * 1001); *returnSize = 0; // 路径栈 int stack[1001]; // 调用递归函数 generatePaths(root, paths, returnSize, stack, 0); return paths; 
}
  • binaryTreePaths,输入:root,二叉树的根节点,returnSize,用来返回路径数量
  • 返回paths,存储路径字符串的数组
  • paths是一个指针数组,用来存储每条路径的字符串
  • stack用来记录当前节点的路径值
  • generatePaths用来来递归生成路径

generatePaths

  • 如果节点root为NULL,直接返回,(递归退出条件)
  • 将当前节点的值存入栈stack[depth]
  • depth表示当前路径的深度
    处理叶子节点
  • 创建字符串,遍历路径栈stack,通过sprintf拼接路径值,将路径字符串的结果保存在paths中
  • 增加路径数量returnSize
    遍历左右子树
  • 如果当前节点不是叶子节点,遍历递归左子树和右子树
  • 子树深度为depth+1

深度

输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点形成树的一条路径,最长路径的长度为树的深度
9

算法思想

如果二叉树为空,深度为0,如果二叉树只有根节点,深度为1
如果二叉树的根节点只有左子树,深度为左子树的深度+1
如果二叉树的根节点只有右子树,深度为右子树的深度+1
如果二叉树的根节点既有既有左子树又有右子树,深度为左右子树深度最大者+1

int maxDepth(BTNode* root)
{if (root == NULL)return 0;// 当前节点的左子树的深度int Lenleft = maxDepth(root->left);// 当前节点的右子树的深度int Lenright = maxDepth(root->right);// 返回左右子树的深度的较大者+1return Lenleft > Lenright ? Lenleft+1 : Lenright+1;
}

到某节点的路径非递归

假设二叉树采用链式存储结构进行存储,root为根节点,p为任意给定节点
求从根节点到p之间路径的非递归算法

算法思想

采用后序非递归遍历二叉树,栈中保留从根节点到当前节点的路径上的所有节点
![[Pasted image 20241121145246.png]]

  • cur是当前遍历的节点
  • s是栈,用来存储当前节点及其祖先节点,用于后续回溯
  • tag数组用于标记每个节点的左右子树是否已经被访问
  • top用来表示栈的当前高度
    while循环用于实现二叉树的深度优先遍历,只要当前节点不为空或者栈不为空就继续
    while循环表示从当前cur节点开始,一直往左遍历,直到没有左子树为止
    每次访问一个节点,将该节点入栈,并设置tag为0,表示其右子树未被访问
    如果当前节点cur就是p,就打印从根节点到p的路径,通过s栈表示

由于p是3节点,将1,2,4,入栈
![[Pasted image 20241121150425.png]]

处理右子树,检查tap里的数据,如果右子树被访问过,就弹出该节点,跳过所有已经完全访问过的节点
如果该节点的右子树未被访问,就会进入右子树进行遍历,

遍历4节点的右子树,tag置为1,节点为空,直接返回
![[Pasted image 20241121150742.png]]

这是循环过来,4被访问过,出栈
![[Pasted image 20241121150805.png]]

再遍历2的右节点,
![[Pasted image 20241121150827.png]]

// 查找从根节点到指定节点p的路径
void Path(BTNode* root, BTNode* p)
{if (root == NULL || p == NULL)return;BTNode* cur = root;// 存储节点路径的栈int s[MaxSize];// 栈的当前高度int top = 0;// 标记左右子树是否访问过int tag[MaxSize] = {0};while (cur || top > 0){// 向左走直到最左叶子节点while (cur){// 将当前节点入栈s[++top] = cur;// 标记为未访问右子树tag[top] = 0;// 找到目标节点pif (cur == p){printf("从根节点到p节点的路径为\n");for (int i = 1; i <= top; i++){printf("%d", s[i]->data);if (i < top)printf("->");printf("\n");return;}}// 继续遍历左子树cur = cur->left;}// 如果当前节点的左子树遍历完,回溯到父节点while (top > 0 && tag[top] == 1)// 出栈top--;// 访问右子树if (top > 0){// 访问当前节点的右子树cur = s[top];// 进入右子树cur = cur->right;// 标记右子树已访问tag[top] = 1;}}
}

相关文章:

二叉树路径相关算法题|带权路径长度WPL|最长路径长度|直径长度|到叶节点路径|深度|到某节点的路径非递归(C)

带权路径长度WPL 二叉树的带权路径长度(WPL)是二叉树所有叶节点的带权路径长度之和&#xff0c;给定一棵二叉树T&#xff0c;采用二叉链表存储&#xff0c;节点结构为 其中叶节点的weight域保存该节点的非负权值&#xff0c;设root为指向T的根节点的指针&#xff0c;设计求W…...

前端:JavaScript (学习笔记)【2】

目录 一&#xff0c;数组的使用 1&#xff0c;数组的创建 [ ] 2&#xff0c;数组的元素和长度 3&#xff0c;数组的遍历方式 4&#xff0c;数组的常用方法 二&#xff0c;JavaScript中的对象 1&#xff0c;常用对象 &#xff08;1&#xff09;String和java中的Stri…...

[面试]-golang基础面试题总结

文章目录 panic 和 recover**注意事项**使用 pprof、trace 和 race 进行性能调试。**Go Module**&#xff1a;Go中new和make的区别 Channel什么是 Channel 的方向性&#xff1f;如何对 Channel 进行方向限制&#xff1f;Channel 的缓冲区大小对于 Channel 和 Goroutine 的通信有…...

【案例】泛微.齐业成助力北京中远大昌汽车实现数电票全流程管理

中远大昌统一发票共享平台上线三个多月以来&#xff0c;实现&#xff1a; 5000份 60000元 发票开具 成本节约 客户简介及需求分析 北京中远大昌汽车服务有限公司&#xff08;以下简称“中远大昌”&#xff09;成立于2002年&#xff0c;是中远海运集团所属香远&#xff08;北…...

微软安全文章合集

说明&#xff1a;文章来自微软很多年前旧帖&#xff0c;有用的部分拿去&#xff0c;没用的就忽略吧&#xff0c;另外提一句&#xff0c;微软会清理文章&#xff0c;很多我收藏的帖子都无法查看了&#xff0c;所以收藏的最好办法是&#xff0c;用word复制粘贴下来保存到云盘&…...

自然语言处理: RAG优化之Embedding模型选型重要依据:mteb/leaderboard榜

本人项目地址大全&#xff1a;Victor94-king/NLP__ManVictor: CSDN of ManVictor git地址&#xff1a;https://github.com/opendatalab/MinerU 写在前面: 笔者更新不易&#xff0c;希望走过路过点个关注和赞&#xff0c;笔芯!!! 写在前面: 笔者更新不易&#xff0c;希望走过路…...

鸿蒙主流路由详解

鸿蒙主流路由详解 Navigation Navigation更适合于一次开发,多端部署,也是官方主流推荐的一种路由控制方式,但是,使用起来入侵耦合度高,所以,一般会使用HMRouter,这也是官方主流推荐的路由 Navigation官网地址 个人源码地址 路由跳转 第一步-定义路由栈 Provide(PageInfo) pag…...

C#构建一个简单的循环神经网络,模拟对话

循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一种用于处理序列数据的神经网络模型。与传统的前馈神经网络不同&#xff0c;RNN具有内部记忆能力&#xff0c;可以捕捉到序列中元素之间的依赖关系。这种特性使得RNN在自然语言处理、语音识别、时间序列预…...

Linux上安装单机版Kibana6.8.1

1. 下载安装包 kibana-6.8.1-linux-x86_64.tar.gz 链接&#xff1a;https://pan.baidu.com/s/1b4kION9wFXIVHuWDn2J-Aw 提取码&#xff1a;rdrc 2. Kibana启动不能使用root用户&#xff0c;使用ES里创建的elsearch用户&#xff0c;进行赋权&#xff1a; chown -R elsearch:els…...

短视频矩阵矩阵,矩阵号策略

随着数字媒体的迅猛发展&#xff0c;短视频平台已经成为企业和个人品牌推广的核心渠道。在这一背景下&#xff0c;短视频矩阵营销策略应运而生&#xff0c;它通过高效整合和管理多个短视频账号&#xff0c;实现资源的最优配置和营销效果的最大化。本文旨在深入探讨短视频矩阵的…...

Rust 力扣 - 2266. 统计打字方案数

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 这题可以先求按了多少次相同连续的按钮&#xff0c;所有的连续相同按钮表示的方案数的乘积就是本题答案 我们的关键问题就转换成了按n个连续相同按钮表示的方案数 设f(i)表示按i个连续相同按钮表示的方案数 如…...

【大数据技术与开发实训】携程景点在线评论分析

景点在线评论分析 题目要求实验目标技术实现数据采集获取所有相关景点页面的 URL获取所有相关景点对应的 poiId 及其他有用信息通过 poiId 获取所有景点的全部评论数据采集结果 数据预处理景点信息的数据预处理查看数据基本信息缺失值处理 用户评论的数据处理缺失值处理分词、去…...

46.坑王驾到第十期:vscode 无法使用 tsc 命令

点赞收藏加关注&#xff0c;你也能住大别墅&#xff01; 一、问题重现 上一篇帖子记录了我昨天在mac上安装typescript及调试的过程。今天打开vscode准备开干的时候&#xff0c;发现tsc命令又无法使用了&#xff0c;然后按照昨天的方法重新安装调试后又能用了&#xff0c;但是关…...

postman 调用 下载接口(download)使用默认名称(response.txt 或随机名称)

官网地址&#xff1a;https://www.postman.com 介绍 Postman 是一款流行的 API 开发和测试工具&#xff0c;用于发送 HTTP 请求、测试接口、调试服务器响应以及进行 API 文档管理。它支持多种请求类型&#xff08;如 GET、POST、PUT、DELETE 等&#xff09;&#xff0c;并且功能…...

单片机_简单AI模型训练与部署__从0到0.9

IDE&#xff1a; CLion MCU&#xff1a; STM32F407VET6 一、导向 以求知为导向&#xff0c;从问题到寻求问题解决的方法&#xff0c;以兴趣驱动学习。 虽从0&#xff0c;但不到1&#xff0c;剩下的那一小步将由你迈出。本篇主要目的是体验完整的一次简单AI模型部署流程&#x…...

对撞双指针(七)三数之和

15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组…...

【Ubuntu24.04】服务部署(虚拟机)

目录 0 背景1 安装虚拟机1.1 下载虚拟机软件1.2 安装虚拟机软件1.2 安装虚拟电脑 2 配置虚拟机2.1 配置虚拟机网络及运行初始化脚本2.2 配置服务运行环境2.2.1 安装并配置JDK172.2.2 安装并配置MySQL8.42.2.3 安装并配置Redis 3 部署服务4 总结 0 背景 你的服务部署在了你的计算…...

timm库加载的模型可视化

在深度学习中&#xff0c;模型的可视化有助于了解模型的结构和层级关系。以下是几种方式来可视化使用 timm 库加载的模型&#xff1a; 打印模型结构 torch.nn.Module 的子类&#xff08;包括 timm 的模型&#xff09;可以通过 print() 查看其结构&#xff1a;import timm# 加…...

服务限流、降级、熔断-SpringCloud

本文所使用的组件&#xff1a;Nacos&#xff08;服务中心和注册中心&#xff09;、OpenFeign&#xff08;服务调用&#xff09;、Sentinel&#xff08;限流、降级&#xff09;、Hystrix&#xff08;熔断&#xff09; 项目结构&#xff1a; service-provider&#xff1a;提供服…...

2024最新YT-DLP使用demo网页端渲染

2024最新YT-DLP使用demo网页端渲染 前提摘要1.使用python的fastapi库和jinjia2库进行前端渲染2.代码实现1&#xff09;目录结构2&#xff09;代码style.cssindex.htmlresult.htmlmain.pyrun.py 3&#xff09;运行测试命令端运行 3.项目下载地址 前提摘要 2024最新python使用yt…...

《第十部分》1.STM32之通信接口《精讲》之IIC通信---介绍

经过近一周的USART学习&#xff0c;我深刻体会到通信对单片机的重要性。它就像人类的手脚和大脑&#xff0c;只有掌握了通信技术&#xff0c;单片机才能与外界交互&#xff0c;展现出丰富多彩的功能&#xff0c;变得更加强大和实用。 单片机最基础的“语言”是二进制。可惜&am…...

wireshark使用lua解析自定义协议

wireshark解析自定义协议 1.自定义的lua放入路径2.修改init.lua2.1 开启lua2.2 init.lua文件最后加入自己的lua文件位置&#xff0c;这里需要确保与自己的文件名相同 3.编写lua4.编写c抓包5.wireshark添加自定义协议如何加调试信息 1.自定义的lua放入路径 一般是自己软件的安装…...

(Keil)MDK-ARM各种优化选项详细说明、实际应用及拓展内容

参考 MDK-ARM各种优化选项详细说明、实际应用及拓展内容 本文围绕MDK-ARM优化选项,以及相关拓展知识(微库、实际应用、调试)进行讲述,希望对你今后开发项目有所帮助。 1 总述 我们所指的优化,主要两方面: 1.代码大小(Size) 2.代码性能(运行时间) 在MDK-ARM中,优…...

Qt实现可拖拽的矩形

之前项目上需要用Qt来绘制可拖拽改变形状的矩形。看了Qt Graphics相关的内容&#xff0c;虽然对Qt怎么添加图元的有了些了解&#xff0c;但是具体如何实现拖拽效果&#xff0c;一时也没有什么好的想法。还好网上有人分享的例子&#xff0c;很受启发。后来又回顾了一下这部分的代…...

CentOS:A服务器主动给B服务器推送(上传),B服务器下载A服务器文件(下载)

Linux:常识(bash: ip command not found )_bash: ip: command not found-CSDN博客 rsync 中断后先判断程序是否自动重连:ps aux | grep rsync 查看目录/文件是否被使用(查询线程占用):lsof /usr/local/bin/mongodump/.B_database1.6uRCTp 场景:MongoDB中集合非常大需要…...

Oracle 执行计划查看方法汇总及优劣对比

在 Oracle 数据库中&#xff0c;查看执行计划是优化 SQL 语句性能的重要工具。以下是几种常用的查看执行计划的方法及其优劣比较&#xff1a; 1. 使用 EXPLAIN PLAN FOR 和 DBMS_XPLAN.DISPLAY 方法 执行 EXPLAIN PLAN FOR 语句&#xff1a; EXPLAIN PLAN FOR SELECT * FROM …...

TCL大数据面试题及参考答案

Mysql 索引失效的场景 对索引列进行运算或使用函数:当在索引列上进行数学运算、函数操作等,索引可能失效。例如,在存储年龄的列上建立了索引,若查询语句是 “SELECT * FROM table WHERE age + 1 = 20”,这里对索引列 age 进行了加法运算,数据库会放弃使用索引而进行全表扫…...

九、FOC原理详解

1、FOC简介 FOC&#xff08;field-oriented control&#xff09;为磁场定向控制&#xff0c;又称为矢量控制&#xff08;vectorcontrol&#xff09;&#xff0c;是目前无刷直流电机&#xff08;BLDC&#xff09;和永磁同步电机&#xff08;PMSM&#xff09;高效控制的最佳选择…...

vue页面成绩案例(for渲染表格/删除/添加/统计总分/平均分/不及格显红色/输入内容去首尾空格trim/输入内容转数字number)

1.使用v-if 和v-else 完成<tbody>标签的条件渲染 2.v-for完成列表渲染 3.:class完成分数标红的条件控制 删哪个就传哪个的id&#xff0c;基于这个id去过滤掉相同id的项&#xff0c;把剩下的项返回 a标签的默认点击事件会跳转 这里要禁止默认事件 即使用click.provent 就…...

STM32编程小工具FlyMcu和STLINK Utility 《通俗易懂》破解

FlyMcu FlyMcu 模拟仿真软件是一款用于 STM32 芯片 ISP 串口烧录程序的专用工具&#xff0c;免费&#xff0c;且较为非常容易下手&#xff0c;好用便捷。 注意&#xff1a;STM32 芯片的 ISP 下载&#xff0c;只能使用串口1&#xff08;USART1&#xff09;&#xff0c;对应的串口…...