【Java数据结构】二叉树详解(四)

🔒文章目录:

1.❤️❤️前言~🥳🎉🎉🎉

2.给定一个二叉树, 找到该树中两个指定节点的最近公共祖先 

2.1第一种思路 

2.2第二种思路  

3.根据一棵树的前序遍历与中序遍历构造二叉树 

4.根据一棵树的中序遍历与后序遍历构造二叉树 

5.二叉树创建字符串

6.二叉树非递归实现前序遍历

 7.二叉树非递归实现中序遍历

8.二叉树非递归实现后序遍历

9.总结


1.❤️❤️前言~🥳🎉🎉🎉

Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。

如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的内容感兴趣,记得关注我👀👀以便不错过每一篇精彩。

当然,如果在阅读中发现任何问题或疑问,我非常欢迎你在评论区留言指正🗨️🗨️。让我们共同努力,一起进步!

加油,一起CHIN UP!💪💪

🔗个人主页:E绵绵的博客
📚所属专栏:

1. JAVA知识点专栏

        深入探索JAVA的核心概念与技术细节

2.JAVA题目练习

        实战演练,巩固JAVA编程技能

3.c语言知识点专栏

        揭示c语言的底层逻辑与高级特性

4.c语言题目练习

        挑战自我,提升c语言编程能力

📘 持续更新中,敬请期待❤️❤️

2.给定一个二叉树, 找到该树中两个指定节点的最近公共祖先 

 📌题目描述 

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)” 


2.1第一种思路 

📋题目思路 

  1. 首先,检查根节点是否为null,如果是,则返回null。这是递归算法的基本情况之一,用于处理空树的情况。

  2. 接下来,检查根节点是否等于其中一个指定节点,如果是,则返回根节点。这是另一个基本情况,处理了当根节点就是目标节点之一的情况。

  3. 然后,分别递归地在左子树和右子树中寻找指定节点的最近公共祖先,并将结果存储在left和right变量中。

  4. 如果左右子树中都找到了指定节点,则说明当前根节点就是这两个节点的最近公共祖先,返回当前根节点。

  5. 如果只有一个子树找到了指定节点,那么这个子树的返回值就是这两个节点的最近公共祖先,返回该子树的返回值。

  6. 如果左右子树都没有找到指定节点,则返回null。

这个算法是一个递归算法,通过深度优先搜索遍历整个树从而查找最近公共祖先。

⏳题目代码  

 // 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。public BTNode lowestCommonAncestor(BTNode root, BTNode p, BTNode q) {if(root==null)return null;if(root==p||root==q)return  root;BTNode left=lowestCommonAncestor(root.left,p,q);BTNode right=lowestCommonAncestor(root.right,p,q);if(left!=null&&right!=null)return  root;if(left==null&&right!=null)return  right;if(left!=null&&right==null)return  left;if(left==null&&right==null)return  null;return  null;}

2.2第二种思路  

📋题目思路  

  1. 首先定义了一个lowestCommonAncestor方法,接收三个参数:根节点root,和两个指定节点pq

  2. 创建了两个Stack对象,stack1stack2,用于分别存储从根节点到指定节点pq的路径。

  3. 调用getStack方法分别获取从根节点到pq的路径,并将路径存储在stack1stack2中。

  4. 如果两条路径都成功获取,则进入后续处理。

  5. 获取到路径后,计算两个栈的大小,并确保它们在最后一个共同节点处相等。如果不相等,则将较长的栈中的节点出栈,直到两个栈的大小相等为止。

  6. 然后,同时从两个栈中弹出元素,直到找到最后一个相同的节点。这个节点就是最近的公共祖先。

  7. 如果没有找到共同节点,返回null。

  8. getStack方法中,也是一个递归方法,用于获取从根节点到指定节点的路径。它接收一个栈对象、根节点和目标节点作为参数。

  9. 如果根节点为null,返回false。

  10. 将当前节点加入栈中。

  11. 如果当前节点是目标节点,则返回true。

  12. 否则,递归地在左子树和右子树中查找目标节点。如果找到目标节点,则直接退出该方法且返回true。否则将栈顶元素弹出,并返回false。

我们这第二种思路利用栈和递归去解决问题的,比第一种思路要相对复杂点。

 ⏳题目代码  

   public BTNode lowestCommonAncestor(BTNode root, BTNode p, BTNode q) {Stack<BTNode> stack1=new Stack<>();Stack<BTNode> stack2=new Stack<>();if (getStack(stack1,root,p)&&getStack(stack2,root,q)){int a= stack1.size();int b= stack2.size();while(a!=b){if(a>b) {stack1.pop();a--;}else{stack2.pop();b--;}}while(!stack1.isEmpty()){if(stack1.peek()==stack2.peek())return  stack1.peek();elsestack1.pop();stack2.pop();}return  null;}return  null;}public boolean getStack(Stack<BTNode> stack,BTNode root,BTNode p){if(root==null)return false;stack.push(root);if (root==p)return true;if(!(getStack(stack,root.left,p)||getStack(stack,root.right,p))) {stack.pop();return false;}return true;}

该题链接:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先 


3.根据一棵树的前序遍历与中序遍历构造二叉树 

 📌题目描述 

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。


 📋题目思路 

我们需要实现一个构建二叉树的方法 buildTree,根据给定的先序遍历数组 preorder 和中序遍历数组 inorder,返回构建的二叉树的根节点。其中,通过静态内部类 TreeNode 来表示二叉树的每个节点,每个节点有一个值 value 和两个指向左右子树的 left、right 指针。

具体实现思路是:先序遍历数组 preorder 的第一个元素为当前根节点,然后在中序遍历数组 inorder 中找到该根节点的位置,从而确定左右子树的范围。而后通过递归方式依次构建左右子树,并返回当前节点,最终返回整棵二叉树的根节点。

其中,我们还要有getIndex 方法用于在中序遍历数组中查找指定值的位置,还需要通过设置成员变量i去遍历先序数组中的元素。

 ⏳题目代码 

//给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,
// 请构造二叉树并返回其根节点。
public class Test3 {public int i;static class TreeNode {int value;TreeNode left;TreeNode right;public TreeNode(int value) {this.value = value;}}public TreeNode buildTree(int[] preorder, int[] inorder) {return    build(preorder,inorder,0,inorder.length-1);}public int getIndex(int[] inorder,int value,int began,int end){for (int j = began; j <=end ; j++) {if(inorder[j]==value)return  j;}return  -1;}public  TreeNode  build(int[] preorder,int[] inorder,int began,int end) {if(began>end)return  null;TreeNode treeNode = new TreeNode(preorder[i]);int index = getIndex(inorder, preorder[i], began,end);i++;treeNode.left = build(preorder,inorder,began,index-1);treeNode.right=build(preorder,inorder,index+1,end);return  treeNode;}}

该题链接:根据一棵树的前序遍历与中序遍历构造二叉树 


4.根据一棵树的中序遍历与后序遍历构造二叉树 

 📌题目描述 

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。


 📋题目思路  

跟我们上一题思路差不多

我们需要实现一个构建二叉树的方法 buildTree,根据给定的后序遍历数组 postorder 和中序遍历数组 inorder,返回构建的二叉树的根节点。其中,通过静态内部类 TreeNode 来表示二叉树的每个节点,每个节点有一个值 value 和两个指向左右子树的 left、right 指针。

具体实现思路是:后序遍历数组 postorder 的最后一个元素为当前根节点,然后在中序遍历数组 inorder 中找到该根节点的位置,从而确定左右子树的范围。而后通过递归方式依次构建左右子树,并返回当前节点,最终返回整棵二叉树的根节点。

 ⏳题目代码 

//给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,
// 请你构造并返回这颗 二叉树 。
public class Test4 {public int i;static class TreeNode {int value;TreeNode left;TreeNode right;public TreeNode(int value) {this.value = value;}}public TreeNode buildTree(int[] inorder, int[] postorder) {i=postorder.length-1;return    build(postorder,inorder,0,inorder.length-1);}public int getIndex(int[] inorder,int value,int began,int end){for (int j = began; j <=end ; j++) {if(inorder[j]==value)return  j;}return  -1;}public TreeNode build(int[] preorder, int[] inorder, int began, int end) {if(began>end)return  null;TreeNode treeNode = new TreeNode(preorder[i]);int index = getIndex(inorder, preorder[i], began,end);i--;treeNode.right = build(preorder,inorder,index+1,end);treeNode.left=build(preorder,inorder,began,index-1);return  treeNode;}}

 该题链接:根据一棵树的中序遍历与后序遍历构造二叉树 


5.二叉树创建字符串

📌题目描述 

给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。

空节点使用一对空括号对 "()" 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。


  📋题目思路  

  1. 定义了一个Solution1类,其中包含了一个静态内部类TreeNode,用于表示二叉树的节点。

  2. tree2str方法是转换函数的入口,接收一个根节点root,返回转换后的字符串。

  3. 创建了一个StringBuilder对象stringBuilder,用于拼接转换后的字符串。

  4. 如果根节点为null,直接返回空字符串。

  5. 将根节点的值添加到stringBuilder中。

  6. 调用getString方法来递归构建字符串。

  7. getString方法是递归构建字符串的核心方法,接收一个StringBuilder对象和当前节点作为参数。

  8. 如果当前节点的左右子节点都为空,说明当前节点是叶子节点,直接返回。

  9. 根据当前节点的左右子节点情况,按照题目要求构建字符串:

    • 如果左子节点为空而右子节点不为空,则添加"()"和右子节点的值。
    • 如果右子节点为空而左子节点不为空,则添加左子节点的值。
    • 如果左右子节点都不为空,则添加左子节点的值和右子节点的值。
  10. 继续递归调用getString方法处理左右子节点。

  11. 最后返回构建好的字符串。

 ⏳题目代码 

//给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。
class Solution1 {static class TreeNode {int value;TreeNode left;TreeNode right;public  TreeNode(int value) {this.value = value;}}public String tree2str(TreeNode root) {StringBuilder stringBuilder=new StringBuilder();if(root==null)return  stringBuilder.toString();stringBuilder.append(root.value);getString (stringBuilder,root);return   stringBuilder.toString();}public void getString(StringBuilder stringBuilder,TreeNode root){if(root.left==null&&root.right==null)return  ;if(root.left==null&&root.right!=null) {stringBuilder.append("()");stringBuilder.append("(");stringBuilder.append(root.right.value);getString(stringBuilder,root.right);stringBuilder.append(")");}if(root.left!=null&&root.right==null){stringBuilder.append("(");stringBuilder.append(root.left.value);getString(stringBuilder,root.left);stringBuilder.append(")");}if(root.left!=null&&root.right!=null){stringBuilder.append("(");stringBuilder.append(root.left.value);getString(stringBuilder,root.left);stringBuilder.append(")");stringBuilder.append("(");stringBuilder.append(root.right.value);getString(stringBuilder,root.right);stringBuilder.append(")");}}}

该题链接:二叉树创建字符串 


6.二叉树非递归实现前序遍历

📌题目描述 

用非递归的方式(循环方式)实现前序遍历

 📋题目思路  

  1. 定义了一个preorderTraversal方法,接收一个根节点root,返回树的前序遍历结果。

  2. 创建了一个ArrayList对象list,用于存储遍历结果。

  3. 创建了一个Stack对象stack,用于辅助遍历。

  4. 如果根节点为null,直接返回空的遍历结果列表。

  5. 进入循环,直到根节点为null并且栈为空为止。

  6. 内部循环:在每次循环中,将当前节点的值加入到遍历结果列表中,并将当前节点入栈。然后,沿着左子树一直向下遍历,直到遇到没有左子节点的节点为止。

  7. 一旦当前节点的左子树遍历完成,将当前节点出栈,并将当前节点指向其右子节点。

  8. 重复步骤6和7,直到遍历完成。

  9. 返回遍历结果列表。

 ⏳题目代码

   public List<Integer> preorderTraversal(BTNode root) {List<Integer> list=new ArrayList<>();Stack<BTNode> stack=new Stack<>();if(root==null)return list;while(root!=null||!stack.isEmpty()){while(root!=null){list.add(root.value);stack.push(root);root=root.left;}root= stack.pop().right;}return list;}

 该题链接:二叉树非递归实现前序遍历


 7.二叉树非递归实现中序遍历

📌题目描述 

用非递归的方式(循环方式)实现中序遍历

  📋题目思路  

  1. 定义了一个inorderTraversal方法,接收一个根节点root,返回树的中序遍历结果。

  2. 创建了一个ArrayList对象list,用于存储遍历结果。

  3. 创建了一个Stack对象stack,用于辅助遍历。

  4. 如果根节点为null,直接返回空的遍历结果列表。

  5. 进入循环,直到根节点为null并且栈为空为止。

  6. 内部循环:在每次循环中,将当前节点的所有左子节点入栈,直到当前节点为空。

  7. 出栈一个节点,并将其右子节点作为当前节点。

  8. 将出栈节点的值添加到遍历结果列表中。

  9. 重复步骤6到8,直到遍历完成。

  10. 返回遍历结果列表。

  ⏳题目代码

public List<Integer> inorderTraversal(BTNode root) {List<Integer> list=new ArrayList<>();Stack<BTNode> stack=new Stack<>();if(root==null)return list;while(root!=null||!stack.isEmpty()){while (root!=null){stack.push(root);root=root.left;}BTNode btNode=stack.pop();root=btNode.right;list.add(btNode.value);}return list;}

该题链接 :二叉树非递归实现中序遍历


8.二叉树非递归实现后序遍历

📌题目描述 

用非递归的方式(循环方式)实现后序遍历

 📋题目思路  

  1. 定义了一个postorderTraversal方法,接收一个根节点root,返回树的后序遍历结果。

  2. 创建了一个ArrayList对象list,用于存储遍历结果。

  3. 创建了一个Stack对象stack,用于辅助遍历。

  4. 如果根节点为null,直接返回空的遍历结果列表。

  5. 进入循环,直到根节点为null并且栈为空为止。

  6. 内部循环:在每次循环中,将当前节点的所有左子节点入栈,直到当前节点为空。

  7. 在每次内部循环结束后,通过stack.peek()获取当前栈顶节点,将其赋值给btNode

  8. 定义prev节点,初始化为当前栈顶节点。

  9. root指向btNode的右子节点。

  10. 如果root为null,说明当前节点的左右子树已经遍历完毕,将当前节点的值加入到遍历结果列表中,并将栈顶节点出栈。

  11. 检查栈是否为空,如果为空,则遍历结束,返回结果列表。

  12. 如果栈不为空,则将root重新指向栈顶节点的右子节点,然后从栈中取出节点,直到当前root节点与prev节点的右子节点不相等为止,将取出的节点加入到结果列表中。

  13. 重复步骤6到12,直到遍历完成。

  14. 返回遍历结果列表。

 ⏳题目代码

   public List<Integer> postorderTraversal(BTNode root) {List<Integer> list=new ArrayList<>();Stack<BTNode> stack=new Stack<>();if(root==null)return list;while (root!=null||!stack.isEmpty()){while(root!=null){stack.push(root);root=root.left;}BTNode btNode= stack.peek();BTNode prev=btNode;root=btNode.right;if(root==null){list.add(stack.pop().value);if (stack.isEmpty())return list;root=stack.peek().right;while (root==prev){prev=stack.pop();list.add(prev.value);if(stack.isEmpty())return  list;root=stack.peek().right;}}}return  list;}}

该题链接:二叉树非递归实现后序遍历 

9.总结 

所以我们这一篇文章就把二叉树的相关习题全讲解完了,二叉树这一章节也就全部结束了。下篇文章将会给大家带来 优先级队列(堆)的讲解。在此,我们诚挚地邀请各位大佬们为我们点赞、关注,并在评论区留下您宝贵的意见与建议。让我们共同学习,共同进步,为知识的海洋增添更多宝贵的财富!🎉🎉🎉❤️❤️💕💕🥳👏👏👏

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

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

相关文章

图文型LED显示屏的结构与安装

随着科技的不断进步&#xff0c;LED显示屏已成为商业广告、公共信息显示等领域不可或缺的一部分。图文型LED显示屏以其独特的优势和多样化的应用场景&#xff0c;受到了市场的广泛欢迎。本文将详细介绍图文型LED显示屏的结构特点、工作原理以及安装指南。 1、图文型LED显示屏的…

跨境电商|Facebook Marketplace怎么做?

2016 年&#xff0c;Facebook打造了同名平台 Facebook Marketplace。通过利用 Facebook 现有的庞大客户群&#xff0c;该平台取得了立竿见影的成功&#xff0c;每月访问量将超过 10 亿。对于个人卖家和小企业来说&#xff0c;Facebook Marketplace是一个不错的销货渠道&#xf…

通过ssr-echarts,服务端生成echarts图

ssr-echarts &#xff1a;一个开源项目&#xff0c;它能够服务端渲染 ECharts 图表&#xff0c;并直接生成 PNG 图片返回。该项目提供了多种主题&#xff0c;并且支持 GET 和 POST 请求。如果参数较多&#xff0c;建议使用 POST 方法。用户可以自己部署这个服务。 1. 服务端安装…

Three.js-实现加载图片并旋转

1.实现效果 2. 实现步骤 2.1创建场景 const scene new THREE.Scene(); 2.2添加相机 说明&#xff1a; fov&#xff08;视场角&#xff09;&#xff1a;视场角决定了相机的视野范围&#xff0c;即相机可以看到的角度范围。较大的视场角表示更广阔的视野&#xff0c;但可能…

SBOM是如何帮助医疗器械制造商提高产品透明度的?

SBOM&#xff08;软件物料清单&#xff09;通过以下方式帮助医疗器械制造商提高产品透明度&#xff1a; 1. 详细记录软件组成 SBOM详细列出了医疗器械所使用的所有软件组件、版本、作者、许可证信息等。这使得制造商能够清晰地了解产品的软件组成&#xff0c;包括每个组件的来…

基于springboot实现民族婚纱预定系统项目【项目源码+论文说明】

基于springboot实现民族婚纱预定系统的设计演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本民族婚纱预定系统就是在这样的大环境下诞生&#xff0c;其可…

【Emgu CV教程】10.15、FillPoly()不规则形状填充颜色

文章目录 一、概念二、填充不规则图形1.原始素材2.代码3.运行结果 二、最大轮廓填充颜色1.原始素材2.代码3.运行结果 一、概念 图像的连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域&#xff0c;连通域分析是指在图像中寻找出彼此互相独立的连通域并将其标记出来…

【最新鸿蒙应用开发】——Want信息载体

信息传递载体Want 1、概述 上一章节我们学习了UIAbility组件 【最新鸿蒙应用开发】——一篇搞懂什么是UIAbility-CSDN博客 &#xff0c;其中组件间的交互传递信息的媒介就是Want&#xff0c;本章节我们来更加深入学习Want的相关知识。 Want是一种对象&#xff0c;用于在应用组…

计算机毕业设计项目、管理系统、可视化大屏、大数据分析、协同过滤、推荐系统、SSM、SpringBoot、Spring、Mybatis、小程序项目编号1-500

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

桌面型激光雕刻机的发展前景及TMC应用优势

一、行业现状 近两年来&#xff0c;激光雕刻行业正处于快速发展阶段。随着人们生活水平的提高&#xff0c;对个性化、定制化产品的需求日益增加&#xff0c;激光雕刻以其独特的创意和精美的效果&#xff0c;满足了消费者对个性化产品的追求。同时&#xff0c;随着科技的不断进…

OCP 安装 OceanBase集群(企业版3.2.4.1)

创建集群 登录OCP界面 1.点击左侧工具栏中的集群 2.进入集群页面后 点击 右上角的创建集群 集群设置 进入 创建集群 页面&#xff0c;进行 目标集群 配置 集群种类 根据 生产环境 选择 分布式 或者 单机集中式&#xff0c;第一次安装 集群类型 选择 主集群。 注意&#xf…

计算机网络到底是指什么?

计算机网络是信息技术领域中最为核心和复杂的一部分&#xff0c;它涵盖了众多的技术原理和应用。下面&#xff0c;我们将从技术层面深入探讨计算机网络的相关内容。 一、计算机网络的分层模型 计算机网络的分层模型是网络通信的基石&#xff0c;它将网络通信过程划分为不同的层…

各大AI模型训练成本大比拼

像OpenAI的ChatGPT、谷歌的Gemini Ultra这样的高级AI模型&#xff0c;训练它们通常需要数百万美元的费用&#xff0c;且该成本还在迅速上升。随着计算需求的增加&#xff0c;训练它们所需的计算能力的费用也在飙升。为此&#xff0c;AI公司正在重新考虑如何训练这些生成式AI系统…

两站图片滑动对比效果实现(VUE3)

像这种图片滑动对比的效果&#xff0c;网上还不少见吧&#xff0c;但是网上却不好找到完整现成的实现代码&#xff0c;我找到几个地方有类似的代码&#xff0c;但是都不好直接移植到代码里&#xff0c;因为很多都是使用原生htmlcssjs实现&#xff0c;太复杂了。反而不好应用到v…

Qt for Android 之 OpenCV编译(Windows下编译)

简介 前两天刚好更新了4.10, 这里以4.10作为示例进行编译&#xff0c; Qt版本是Qt6.6.2。 准备OpenCV的Android库 一. 使用官方编译好的库 1. 下载OpenCV android SDK opencv-4.10.0-android-sdk.zip 2. 解压缩 官方提供的包含了多个架构的opencv android库 二. 自行编译…

十三、【源码】ResultMap解析

源码地址&#xff1a;https://github.com/mybatis/mybatis-3/ 仓库地址&#xff1a;https://gitcode.net/qq_42665745/mybatis/-/tree/13-resultMap ResultMap解析 分为两部分&#xff1a;解析和使用 1.解析 解析XML的时候单独解析所有的resultMap标签&#xff0c;封装成Re…

MySQL 核心模块揭秘 | 19 期 | 锁模块里有什么?什么样?

InnoDB 中管理表锁和行锁的锁模块&#xff0c;也就是传说中的锁子系统&#xff0c;在内存里是什么样的&#xff1f; 作者&#xff1a;操盛春&#xff0c;爱可生技术专家&#xff0c;公众号『一树一溪』作者&#xff0c;专注于研究 MySQL 和 OceanBase 源码。 爱可生开源社区出品…

LabVIEW开发EOL功能测试系统

LabVIEW开发EOL功能测试系统 介绍了一种基于LabVIEW开发的EOL功能测试系统方案&#xff0c;涵盖软件架构、工作流程、模块化设计、低耦合性、易于修改与维护、稳定性及硬件选型。系统通过高效的CAN通信实现对电机控制器的全面测试&#xff0c;确保运行可靠并支持未来的升级需求…

危机公关之负面信息优化技巧解析

当今时代&#xff0c;网络发布信息没有任何门槛&#xff0c;任何人可以通过互联网发布信息&#xff0c;这使负面信息产生的可能性大大提高&#xff0c;企业形成危机的可能性也大大提高。针对网络上的负面信息处理得当可能并不会对品牌造成伤害&#xff0c;处理不当就很可能给企…

QT之可拖动布局研究

1. 背景 最开始只用到了最基本的水平布局 、垂直布局。它的好处就是窗口整体缩放后&#xff0c;控件也自动等比例缩放。 但是比如水平布局之中的控件宽度比例、垂直布局之中的控件高度比例都是固定的。 平时也不怎么开发界面&#xff0c;最近有个需求&#xff0c;想界面上的…