🔥个人主页:@草莓熊Lotso

🎬作者简介:C++研发方向学习者

📖个人专栏: 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》

⭐️人生格言:生活是默默的坚持,毅力是永久的享受。  

前言: 通过前面几篇博客我们已经完成了前中后序的接口实现,我们现在开始需要进行其它二叉树常用方法的实现,比如二叉树节点个数,叶子节点个数等。还是和之前一样分部分实现,最后再展示全部的代码。


目录

一.求二叉树节点个数

代码实现: 

test.c: 

二.求二叉树叶子节点个数

代码实现:

test.c: 

 三.求二叉树第k层节点个数

代码实现: 

test.c: 

 四.求二叉树的深度/高度

 代码实现:

test.c: 

 五.二叉树查找值为x的节点

代码实现:

test.c:

 六.二叉树的销毁 

代码实现:

 七.代码展现

Tree.h:

Tree.c:

test.c:


一.求二叉树节点个数

--我们先来实现一个求二叉树的节点个数的接口,在正式开始之前我们先把上次写的代码里的test.c中创建树的代码优化一下,这样方便后续操作

#include"Tree.h"BTNode* buyNode(char x)
{BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));newnode->data = x;newnode->left = newnode->right = NULL;return newnode;
}
BTNode* CreateTree()
{BTNode* nodeA = buyNode('A');BTNode* nodeB = buyNode('B');BTNode* nodeC = buyNode('C');BTNode* nodeD = buyNode('D');BTNode* nodeE = buyNode('E');BTNode* nodeF = buyNode('F');nodeA->left = nodeB;nodeA->right = nodeC;nodeB->left = nodeD;nodeC->left = nodeE;nodeC->right = nodeF;return nodeA;
}void test1()
{BTNode* root = CreateTree();//前中后序遍历//PreOrder(root);//InOrder(root);//PostOrder(root);
}int main()
{test1();return 0;
}

--优化完之后,我们就可以开始实现求二叉树节点个数的接口了 

  •  二叉树结点个数=根节点+左子树结点个数+右子树结点个数

代码实现: 

// 二叉树结点个数=根节点+左子树节点个数+右子树节点个数
int BinaryTreeSize(BTNode* root)
{if (root == NULL){return 0;}return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}

    图示如下:

    test.c: 

    #include"Tree.h"BTNode* buyNode(char x)
    {BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));newnode->data = x;newnode->left = newnode->right = NULL;return newnode;
    }
    BTNode* CreateTree()
    {BTNode* nodeA = buyNode('A');BTNode* nodeB = buyNode('B');BTNode* nodeC = buyNode('C');BTNode* nodeD = buyNode('D');BTNode* nodeE = buyNode('E');BTNode* nodeF = buyNode('F');nodeA->left = nodeB;nodeA->right = nodeC;nodeB->left = nodeD;nodeC->left = nodeE;nodeC->right = nodeF;return nodeA;
    }void test1()
    {BTNode* root = CreateTree();//前中后序遍历//PreOrder(root);//InOrder(root);//PostOrder(root);//二叉树结点个数printf("Size: %d\n", BinaryTreeSize(root));
    }int main()
    {test1();return 0;
    }

    --测试完成,打印出来没有问题,退出码为0 


    二.求二叉树叶子节点个数

    --二叉树的叶子节点就是左右孩子都为空的节点

    • 二叉树叶子节点个数=左子树叶子节点个数+右子树叶子节点个数

    代码实现:

    // 二叉树叶子结点个数=左子树叶子节点个数+右子树节点个数
    int BinaryTreeLeafSize(BTNode* root)
    {if (root == NULL){return 0;}//判断是否为叶子节点(没有左右孩子)if (root->left == NULL && root->right == NULL){return 1;}return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
    }

    图示如下: 

    test.c: 

    #include"Tree.h"BTNode* buyNode(char x)
    {BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));newnode->data = x;newnode->left = newnode->right = NULL;return newnode;
    }
    BTNode* CreateTree()
    {BTNode* nodeA = buyNode('A');BTNode* nodeB = buyNode('B');BTNode* nodeC = buyNode('C');BTNode* nodeD = buyNode('D');BTNode* nodeE = buyNode('E');BTNode* nodeF = buyNode('F');nodeA->left = nodeB;nodeA->right = nodeC;nodeB->left = nodeD;nodeC->left = nodeE;nodeC->right = nodeF;return nodeA;
    }void test1()
    {BTNode* root = CreateTree();//前中后序遍历//PreOrder(root);//InOrder(root);//PostOrder(root);//二叉树结点个数printf("Size: %d\n", BinaryTreeSize(root));//二叉树叶子结点个数printf("LeafSize: %d\n", BinaryTreeLeafSize(root));
    }int main()
    {test1();return 0;
    }

    --测试完成,打印没有问题,退出码为0


     三.求二叉树第k层节点个数

    --当k==1时当前节点就是第k层节点

    • 二叉树第k层节点个数=左子树第k-1层节点个数+右子树第k-1层节点个数

    代码实现: 

    // 二叉树第k层节点个数=左子树第K-1层节点个数+右子树第k-1层节点个数
    int BinaryTreeLevelKSize(BTNode* root, int k)
    {if (root == NULL){return 0;}//判断是否为第k层if (k == 1){return 1;}//每次注意要k-1return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);
    }

    图示如下: 

    test.c: 

    #include"Tree.h"BTNode* buyNode(char x)
    {BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));newnode->data = x;newnode->left = newnode->right = NULL;return newnode;
    }
    BTNode* CreateTree()
    {BTNode* nodeA = buyNode('A');BTNode* nodeB = buyNode('B');BTNode* nodeC = buyNode('C');BTNode* nodeD = buyNode('D');BTNode* nodeE = buyNode('E');BTNode* nodeF = buyNode('F');nodeA->left = nodeB;nodeA->right = nodeC;nodeB->left = nodeD;nodeC->left = nodeE;nodeC->right = nodeF;return nodeA;
    }void test1()
    {BTNode* root = CreateTree();//前中后序遍历//PreOrder(root);//InOrder(root);//PostOrder(root);//二叉树结点个数printf("Size: %d\n", BinaryTreeSize(root));//二叉树叶子结点个数printf("LeafSize: %d\n", BinaryTreeLeafSize(root));//第k层节点个数printf("K Size: %d\n", BinaryTreeLevelKSize(root,3));
    }int main()
    {test1();return 0;
    }

    --测试完成,打印没有问题,退出码为0


     四.求二叉树的深度/高度

    • 二叉树的高度=根节点+max(左子树的高度,右子树的高度)

     代码实现:

    //二叉树的深度/高度=根节点+max(左子树高度,右子树高度)
    int BinaryTreeDepth(BTNode* root)
    {if (root == NULL){return 0;}int leftdepth = BinaryTreeDepth(root->left);int rightdepth = BinaryTreeDepth(root->right);return 1 + (leftdepth > rightdepth ? leftdepth : rightdepth);
    }

    图示如下:

    test.c: 

    #include"Tree.h"BTNode* buyNode(char x)
    {BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));newnode->data = x;newnode->left = newnode->right = NULL;return newnode;
    }
    BTNode* CreateTree()
    {BTNode* nodeA = buyNode('A');BTNode* nodeB = buyNode('B');BTNode* nodeC = buyNode('C');BTNode* nodeD = buyNode('D');BTNode* nodeE = buyNode('E');BTNode* nodeF = buyNode('F');nodeA->left = nodeB;nodeA->right = nodeC;nodeB->left = nodeD;nodeC->left = nodeE;nodeC->right = nodeF;return nodeA;
    }void test1()
    {BTNode* root = CreateTree();//前中后序遍历//PreOrder(root);//InOrder(root);//PostOrder(root);//二叉树结点个数printf("Size: %d\n", BinaryTreeSize(root));//二叉树叶子结点个数printf("LeafSize: %d\n", BinaryTreeLeafSize(root));//第k层节点个数printf("K Size: %d\n", BinaryTreeLevelKSize(root,3));//二叉树的深度/高度printf("Depth: %d\n", BinaryTreeDepth(root));
    }int main()
    {test1();return 0;
    }

    --测试完成,打印没有问题,退出码为0


     五.二叉树查找值为x的节点

    --递归查找,找到了就返回当前节点,如果是在左子树中找到就直接返回,没找到继续来到右子树找,最好都没找到就返回NULL

    代码实现:

    // 二叉树查找值为x的结点
    BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
    {if (root == NULL){return NULL;}if (root->data == x){return root;}BTNode*leftroot = BinaryTreeFind(root->left, x);//如果leftroot不为空就是找到了直接返回if (leftroot){return leftroot;}//没找到就继续右子树找BTNode* rightroot = BinaryTreeFind(root->right, x);if (rightroot){return rightroot;}//都没找到就返回空return NULL;
    }

    图示如下: 

    test.c:

    #include"Tree.h"BTNode* buyNode(char x)
    {BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));newnode->data = x;newnode->left = newnode->right = NULL;return newnode;
    }
    BTNode* CreateTree()
    {BTNode* nodeA = buyNode('A');BTNode* nodeB = buyNode('B');BTNode* nodeC = buyNode('C');BTNode* nodeD = buyNode('D');BTNode* nodeE = buyNode('E');BTNode* nodeF = buyNode('F');nodeA->left = nodeB;nodeA->right = nodeC;nodeB->left = nodeD;nodeC->left = nodeE;nodeC->right = nodeF;return nodeA;
    }void test1()
    {BTNode* root = CreateTree();//前中后序遍历//PreOrder(root);//InOrder(root);//PostOrder(root);//二叉树结点个数printf("Size: %d\n", BinaryTreeSize(root));//二叉树叶子结点个数printf("LeafSize: %d\n", BinaryTreeLeafSize(root));//第k层节点个数printf("K Size: %d\n", BinaryTreeLevelKSize(root,3));//二叉树的深度/高度printf("Depth: %d\n", BinaryTreeDepth(root));//二叉树查找值为x的结点BTNode* pos = BinaryTreeFind(root, 'E');if (pos){printf("找到了\n");}else {printf("没找到\n");}
    }int main()
    {test1();return 0;
    }

    --测试完成,找的到E,退出码为0


     六.二叉树的销毁 

    --由于提前释放根节点无法找到其左右节点,所以我们得采用后续遍历的思想,最后处理根节点,

    还有这里得传地址,后续的使用也需要注意一下写法。

    代码实现:

    // 二叉树销毁--采用后序遍历的思想
    void BinaryTreeDestory(BTNode** root)
    {if (*root == NULL){return;}BinaryTreeDestory(&(*root)->left);BinaryTreeDestory(&(*root)->right);free(*root);*root = NULL;
    }
    

    图示如下:


     七.代码展现

    Tree.h:

    #pragma once
    #include<stdio.h>
    #include<assert.h>
    #include<stdlib.h>
    #include<stdbool.h>typedef char BTDataType;
    typedef struct BinaryNode
    {BTDataType data;struct BinaryNode* left;//左孩子struct BinaryNode* right;//右孩子
    }BTNode;//前序遍历
    void PreOrder(BTNode* root);//中序遍历
    void InOrder(BTNode* root);//后序遍历
    void PostOrder(BTNode* root);// 二叉树结点个数
    int BinaryTreeSize(BTNode* root);// 二叉树叶子结点个数
    int BinaryTreeLeafSize(BTNode* root);// 二叉树第k层结点个数
    int BinaryTreeLevelKSize(BTNode* root, int k);//二叉树的深度/高度
    int BinaryTreeDepth(BTNode* root);// 二叉树查找值为x的结点
    BTNode* BinaryTreeFind(BTNode* root, BTDataType x);// 二叉树销毁
    void BinaryTreeDestory(BTNode** root);

    Tree.c:

    #include"Tree.h"//前序遍历
    void PreOrder(BTNode* root)
    {if (root == NULL){printf("NULL ");return;}//根左右printf("%c ", root->data);PreOrder(root->left);PreOrder(root->right);
    }//中序遍历
    void InOrder(BTNode* root)
    {if (root == NULL){printf("NULL ");return;}//左根右InOrder(root->left);printf("%c ", root->data);InOrder(root->right);
    }//后序遍历
    void PostOrder(BTNode* root)
    {if (root == NULL){printf("NULL ");return;}//左右根PostOrder(root->left);PostOrder(root->right);printf("%c ", root->data);
    }// 二叉树结点个数=根节点+左子树节点个数+右子树节点个数
    int BinaryTreeSize(BTNode* root)
    {if (root == NULL){return 0;}return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
    }// 二叉树叶子结点个数=左子树叶子节点个数+右子树节点个数
    int BinaryTreeLeafSize(BTNode* root)
    {if (root == NULL){return 0;}//判断是否为叶子节点(没有左右孩子)if (root->left == NULL && root->right == NULL){return 1;}return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
    }// 二叉树第k层节点个数=左子树第K-1层节点个数+右子树第k-1层节点个数
    int BinaryTreeLevelKSize(BTNode* root, int k)
    {if (root == NULL){return 0;}//判断是否为第k层if (k == 1){return 1;}//每次注意要k-1return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);
    }//二叉树的深度/高度=根节点+max(左子树高度,右子树高度)
    int BinaryTreeDepth(BTNode* root)
    {if (root == NULL){return 0;}int leftdepth = BinaryTreeDepth(root->left);int rightdepth = BinaryTreeDepth(root->right);return 1 + (leftdepth > rightdepth ? leftdepth : rightdepth);
    }// 二叉树查找值为x的结点
    BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
    {if (root == NULL){return NULL;}if (root->data == x){return root;}BTNode*leftroot = BinaryTreeFind(root->left, x);//如果leftroot不为空就是找到了直接返回if (leftroot){return leftroot;}//没找到就继续右子树找BTNode* rightroot = BinaryTreeFind(root->right, x);if (rightroot){return rightroot;}//都没找到就返回空return NULL;
    }// 二叉树销毁--采用后序遍历的思想
    void BinaryTreeDestory(BTNode** root)
    {if (*root == NULL){return;}BinaryTreeDestory(&(*root)->left);BinaryTreeDestory(&(*root)->right);free(*root);*root = NULL;
    }

    test.c:

    #include"Tree.h"BTNode* buyNode(char x)
    {BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));newnode->data = x;newnode->left = newnode->right = NULL;return newnode;
    }
    BTNode* CreateTree()
    {BTNode* nodeA = buyNode('A');BTNode* nodeB = buyNode('B');BTNode* nodeC = buyNode('C');BTNode* nodeD = buyNode('D');BTNode* nodeE = buyNode('E');BTNode* nodeF = buyNode('F');nodeA->left = nodeB;nodeA->right = nodeC;nodeB->left = nodeD;nodeC->left = nodeE;nodeC->right = nodeF;return nodeA;
    }void test1()
    {BTNode* root = CreateTree();//前中后序遍历//PreOrder(root);//InOrder(root);//PostOrder(root);//二叉树结点个数printf("Size: %d\n", BinaryTreeSize(root));//二叉树叶子结点个数printf("LeafSize: %d\n", BinaryTreeLeafSize(root));//第k层节点个数printf("K Size: %d\n", BinaryTreeLevelKSize(root,3));//二叉树的深度/高度printf("Depth: %d\n", BinaryTreeDepth(root));//二叉树查找值为x的结点BTNode* pos = BinaryTreeFind(root, 'E');if (pos){printf("找到了\n");}else {printf("没找到\n");}// 二叉树销毁BinaryTreeDestory(&root);
    }int main()
    {test1();return 0;
    }

    往期回顾:

    【数据结构初阶】--树和二叉树先导篇

    【数据结构初阶】--二叉树(二)

    【数据结构初阶】--二叉树(三)

    【数据结构初阶】--二叉树(四)

    结语:在这篇博客中我们一起实现了二叉树的大部分常用接口,后面还有一个判断是否为完全二叉树和一个层序遍历的实现。如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。

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

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

    相关文章

    redis布隆过滤器解决缓存击穿问题

    在电商系统中&#xff0c;商品详情页是一个典型的高频访问场景。当用户请求某个商品的详情时&#xff0c;系统会优先从缓存中获取数据。如果缓存中没有该商品的详情&#xff0c;系统会去数据库查询并更新缓存。然而&#xff0c;如果某个热门商品的缓存失效&#xff0c;大量请求…

    1+1>2!特征融合如何让目标检测更懂 “场景”?

    来gongzhonghao【图灵学术计算机论文辅导】&#xff0c;快速拿捏更多计算机SCI/CCF发文资讯&#xff5e;在多模态大模型&#xff08;MLLM&#xff09;时代&#xff0c;特征融合与目标检测的研究方向正变得愈发关键。从红外与可见光图像的融合&#xff0c;到语音活动检测中的特征…

    详解赛灵思SRIO IP并提供一种FIFO封装SRIO的收发控制器仿真验证

    概述RapidIO标准定义为三层&#xff1a;逻辑层、传输层、物理层。逻辑层&#xff1a;定义总体协议和包格式&#xff0c;包含设备发起/完成事务的必要信息。传输层&#xff1a;提供包传输的路由信息&#xff08;对顶层不可见&#xff09;。物理层&#xff1a;描述设备级接口细节…

    深度学习:简介与任务分类总览

    一、什么是深度学习&#xff1f;1.1 深度学习的定义深度学习&#xff08;Deep Learning&#xff09;是机器学习的一种特殊形式&#xff0c;它依赖于具有多层结构的神经网络自动从数据中学习特征并完成任务&#xff0c;如图像识别&#xff0c;语音识别&#xff0c;自然语言处理等…

    MSPM0开发学习笔记:二维云台画图(2025电赛 附源代码及引脚配置)

    前言 今年的电赛&#xff08;2025&#xff09;&#xff0c;很多题都与云台相关&#xff0c;因此为备战电赛&#xff0c;博主这边也是准备了一个由两个42步进电机驱动的云台并提前进行调试&#xff0c;避免赛题出来之后手忙脚乱的&#xff0c;这边的两个42步进电机采用同一个驱…

    借助 Wisdom SSH 的 AI 助手构建 Linux 开发环境

    借助Wisdom SSH的AI助手构建Linux开发环境 在Linux系统的开发场景中&#xff0c;快速、准确地搭建开发环境至关重要。Wisdom SSH凭借其强大的AI助手&#xff0c;能极大简化这一过程&#xff0c;其官网为ssh.wisdomheart.cn。以下以在Ubuntu 22.04服务器上构建Python开发环境&am…

    Python 程序设计讲义(44):组合数据类型——集合类型:创建集合

    Python 程序设计讲义&#xff08;44&#xff09;&#xff1a;组合数据类型——集合类型&#xff1a;创建集合 目录Python 程序设计讲义&#xff08;44&#xff09;&#xff1a;组合数据类型——集合类型&#xff1a;创建集合一、集合的特征二、创建集合&#xff1a;使用set()函…

    10 - 大语言模型 —Transformer 搭骨架,BERT 装 “双筒镜”|解密双向理解的核心

    目录 1、为什么 BERT 能 “懂” 语言&#xff1f;先看它的 “出身” 2、核心逻辑 2.1、“自学阶段”—— 预训练&#xff0c;像婴儿学说话一样积累语感 2.1.1、简述 2.1.2、核心本事&#xff1a;“双向注意力”&#xff0c;像人一样 “聚焦重点” 2.2、“专项复习”—— …

    【Spring Boot 快速入门】四、MyBatis

    目录MyBatis&#xff08;一&#xff09;入门简介MyBatis 入门LombokMyBatis 基础操作数据准备删除预编译新增更新查询XML 映射文件MyBatis&#xff08;一&#xff09;入门 简介 MyBatis 是一款 优秀的持久层框架&#xff0c;它支持 自定义 SQL、存储过程以及高级映射&#xf…

    Spring IOC 基于Cglib实现含构造函数的类实例化策略

    作者&#xff1a;小凯 分享、让自己和他人都能有所收获&#xff01; 一、前言 技术成长&#xff0c;是对场景设计细节不断的雕刻&#xff01; 你觉得自己的技术什么时候得到了快速的提高&#xff0c;是CRUD写的多了以后吗&#xff1f;想都不要想&#xff0c;绝对不可能&#xf…

    composer 常用命令

    ### 设置镜像源全局设置composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/当个项目设置composer config repo.packagist composer https://mirrors.aliyun.com/composer/恢复官方源composer config -g --unset repos.packagist### 常用源阿里云…

    【python】Python爬虫入门教程:使用requests库

    Python爬虫入门教程&#xff1a;使用requests库 爬虫是数据获取的重要手段&#xff0c;下面我将通过一个完整的示例&#xff0c;教你如何使用Python的requests库编写一个简单的爬虫。我们将以爬取豆瓣电影Top250为例。 【python】网络爬虫教程 - 教你用python爬取豆瓣电影 Top…

    OpenCV图像缩放:resize

    图像缩放是图像处理中的基础操作之一。无论是图像预处理、数据增强还是图像金字塔构建&#xff0c;cv::resize 都是我们最常用的函数之一。但你是否注意到&#xff0c;在 OpenCV 中同时还存在一个名为 cv::Mat::resize 的方法&#xff1f;这两个函数虽然名字类似&#xff0c;但…

    汽车、航空航天、适用工业虚拟装配解决方案

    一、现状在制造业数字化转型浪潮中&#xff0c;传统装配过程仍面临诸多挑战&#xff1a;物理样机试错成本高、装配周期冗长、工艺优化依赖经验、跨部门协作效率低下……如何打破“试错-返工”的恶性循环&#xff1f;目前总装工艺通过DELMIA、NX、Creo等工程软件进行工艺装配验证…

    页面跳转和前端路由的区别

    传统方式&#xff1a;通过改变浏览器地址栏的 URL 来实现window.location.href /new-page<a href"/new-page">跳转到新页面</a>会导致整个页面重新加载会触发浏览器向服务器发送新的请求页面状态不会保留&#xff0c;所有资源重新加载可以避免新上线的内…

    C/C++核心知识点详解

    C/C核心知识点详解 1. 变量的声明与定义&#xff1a;内存分配的本质区别 核心概念 在C/C中&#xff0c;变量的声明和定义是两个完全不同的概念&#xff1a; 声明&#xff08;Declaration&#xff09;&#xff1a;告诉编译器变量的名称和类型&#xff0c;但不分配内存空间定义&a…

    物联网发展:从概念到应用的演变历程

    物联网的发展历程是一部技术革新与社会需求共同驱动的进化史&#xff0c;其演变可划分为概念萌芽、技术积累、应用拓展和智能融合四个阶段&#xff0c;每个阶段均以关键技术突破或社会需求变革为标志&#xff0c;最终形成万物互联的智能生态。以下是具体演变历程&#xff1a;一…

    一个人开发一个App(数据库)

    后端要保存数据&#xff0c;我还是选择了关系型数据库Mysql, 因为其它的不熟悉。 flutter端这次我选择的是ObjectBox&#xff0c;以前都是直接用的sqlite3&#xff0c;看对比ObjectBox效率比sqlite3高许多&#xff0c;这次前端为了用户体验&#xff0c;我需要缓存数据&#xff…

    天铭科技×蓝卓 | “1+2+N”打造AI驱动的汽车零部件行业智能工厂

    7月24日&#xff0c;杭州天铭科技股份有限公司&#xff08;简称 “天铭科技”&#xff09;与蓝卓数字科技有限公司&#xff08;简称 “蓝卓”&#xff09;签订全面战略合作协议。天铭科技董事长张松、副总经理艾鸿冰&#xff0c;蓝卓副董事长谭彰等领导出席签约仪式&#xff0c…

    技术复盘报告:Vue表格中多行文本字段数据保存丢失问题

    1. 问题背景 在一个基于 Vue 2.0 和 ElementUI 的复杂数据维护页面中&#xff0c;用户报告了一个偶发但严重的问题&#xff1a;在表格中编辑一个多行文本&#xff08;textarea&#xff09;字段时&#xff0c;输入的内容有时会在点击“保存”后丢失。 具体表现&#xff1a; 前端…