实验6 二叉树操作

news2025/1/16 20:12:49

0x01 实验目的

掌握二叉树的基本概念,二叉树的存储结构使用链表。

0x02 实验内容

  1. 输入一个完全二叉树的层次遍历字符串,创建这个二叉树,输出这个二叉树的前序遍历字符串、中序遍历字符串、后序遍历字符串、结点数目、二叉树高度(上述每一个结果独立一行显示)。
  2. 输入二叉树前序序列和中序序列(各元素各不相同),创建这个二叉树,输出该二叉树的后序序列、层次遍历。

0x03 实验过程

层次遍历

判断队列是否为空的条件必须加上,因为队列为空时,有可能会通过q.front()获取到一些非NULL的奇怪的东西,然后获取其element时会报错。

void levelOrder(binaryTreeNode<E>* node) {
			queue<binaryTreeNode<E>*> q;
			while (node != NULL) {
				if(Level == 0) {
					Level++;
					cout<<node->element;
					if(node->leftChild != NULL) q.push(node->leftChild);
					if(node->rightChild != NULL) q.push(node->rightChild);
					if(!q.empty()) {
						node = q.front();
						q.pop();
					}else node = NULL; 
				} else {
					cout<<","<<node->element;
					if(node->leftChild != NULL) q.push(node->leftChild);
					if(node->rightChild != NULL) q.push(node->rightChild);
					if(!q.empty()) {
						node = q.front();
						q.pop();
					}else node = NULL; 
				}

			}
		}

层次遍历构建二叉树

先将第一个节点放入队列,之后树上每添加一个节点就要将该节点入队列。先进先出的进行添加节点操作,直到node数组空了。

template <class E>
binaryTreeNode<E>* constructTreeByLevelOrder(binaryTreeNode<E> node[],int num) {
	queue<binaryTreeNode<E>*> q;
	q.push(&node[0]);
	int i = 1;
	while(i < num) {
		binaryTreeNode<E>* current = q.front();
		q.pop();
		if(i < num) {
			current->leftChild = &node[i];
			q.push(&node[i]);
		}
		i++;
		if(i < num) {
			current->rightChild = &node[i];
			q.push(&node[i]);
		}
		i++;
	}
	return &node[0];
}

前序遍历和中序遍历构建二叉树

采用递归地形式,依次构建左子树和右子树。利用前序遍历的的第一个节点是头节点,以及在中序遍历中头结点的两侧分别为左子树和右子树这两个性质。

template<class E>
binaryTreeNode<E>* create(binaryTreeNode<E> preorder[], int p, int q, binaryTreeNode<E> inorder[], int i, int j) {
	if (p > q) return nullptr;
	if (p == q) return &preorder[p];
	int k = i;
	// 找到根节点在中序遍历序列中的位置
	while (preorder[p].element != inorder[k].element) k++;
	preorder[p].leftChild = create(preorder, p+1, p+k, inorder, i, k-1);
	preorder[p].rightChild = create(preorder, p+k+1, q, inorder, k+1, j);
	return &preorder[p];
}

改BUG

在这里插入图片描述
在这里插入图片描述

0x04 实验源码

#include<bits/stdc++.h>
using namespace std;
int in = 0;
int post = 0;
int Level = 0;
template<class T>
class binaryTreeNode {
	public:
		T element;
		binaryTreeNode<T> *leftChild,*rightChild;
		binaryTreeNode() {
			leftChild  = rightChild = NULL;
		}
		binaryTreeNode(const T& theElement) : element(theElement) {
			leftChild = rightChild = NULL;
		}
		binaryTreeNode(const T& theElement, binaryTreeNode *theLeftChild, binaryTreeNode *theRightChild):element(theElement) {
			leftChild = theLeftChild;
			rightChild = theRightChild;
		}
};
template<class E>
class linkedBinaryTree {
	public:
		linkedBinaryTree() {
			root = NULL;
			treeSize = 0;
		}
		bool empty() const {
			return treeSize == 0;
		}
		int size() const {
			return treeSize;
		}
		void setSize(int size) {
			treeSize = size;
		}
		void preOrder(binaryTreeNode<E>* node,int level) {
			if(node != NULL) {
				if(level == 0) {
					cout<<node->element;
					preOrder(node->leftChild, ++level);
					preOrder(node->rightChild, ++level);
				} else {
					cout<<","<<node->element;
					preOrder(node->leftChild, ++level);
					preOrder(node->rightChild, ++level);
				}
			}
		}
		void inOrder(binaryTreeNode<E>* node) {
			if(node != NULL) {
				if(node->leftChild == NULL && in == 0) {
					cout<<node->element;
					in++;
				} else {
					inOrder(node->leftChild);
					cout<<","<<node->element;
					inOrder(node->rightChild);
				}

			}
		}
		void postOrder(binaryTreeNode<E>* node) {
			if(node != NULL) {
				if(node->leftChild == NULL && post == 0) {
					cout<<node->element;
					post++;
				} else {
					postOrder(node->leftChild);
					postOrder(node->rightChild);
					cout<<","<<node->element;
				}
			}
		}
		void levelOrder(binaryTreeNode<E>* node) {
			queue<binaryTreeNode<E>*> q;
			while (node != NULL) {
				if(Level == 0) {
					Level++;
					cout<<node->element;
					if(node->leftChild != NULL) q.push(node->leftChild);
					if(node->rightChild != NULL) q.push(node->rightChild);
					if(!q.empty()) {
						node = q.front();
						q.pop();
					}else node = NULL; 
				} else {
					cout<<","<<node->element;
					if(node->leftChild != NULL) q.push(node->leftChild);
					if(node->rightChild != NULL) q.push(node->rightChild);
					if(!q.empty()) {
						node = q.front();
						q.pop();
					}else node = NULL; 
				}

			}
		}
		int getHeight(binaryTreeNode<E>* node) {
			if(node == NULL) return 0;
			int h1 = getHeight(node->leftChild);
			int h2 = getHeight(node->rightChild);
			if(h1 > h2) {
				return ++h1;
			} else {
				return ++h2;
			}
		}
	private:
		binaryTreeNode<E> *root;
		int treeSize;
};
template <class E>
binaryTreeNode<E>* constructTreeByLevelOrder(binaryTreeNode<E> node[],int num) {
	queue<binaryTreeNode<E>*> q;
	q.push(&node[0]);
	int i = 1;
	while(i < num) {
//		cout<<"q.front()"<<q.front()<<endl;
//		cout<<"&q.front()"<<&q.front()<<endl;
//		cout<<"node[0]"<<&node[0]<<endl;
//		cout<<"node[0]"<<&node<<endl;
		binaryTreeNode<E>* current = q.front();
		q.pop();
		if(i < num) {
			current->leftChild = &node[i];
//			cout<<current->leftChild->element<<endl;
//			cout<<node[0].leftChild->element<<endl;
			q.push(&node[i]);
		}
		i++;
		if(i < num) {
			current->rightChild = &node[i];
			q.push(&node[i]);
		}
		i++;
	}
	return &node[0];
}
template<class E>
binaryTreeNode<E>* create(binaryTreeNode<E> preorder[], int p, int q, binaryTreeNode<E> inorder[], int i, int j) {
	if (p > q) return nullptr;
	if (p == q) return &preorder[p];
	int k = i;
	// 找到根节点在中序遍历序列中的位置
	while (preorder[p].element != inorder[k].element) k++;
	preorder[p].leftChild = create(preorder, p+1, p+k, inorder, i, k-1);
	preorder[p].rightChild = create(preorder, p+k+1, q, inorder, k+1, j);
	return &preorder[p];
}
int main() {
  //两种写法都可以。
	//binaryTreeNode<char> *node = new binaryTreeNode<char>[100];
	binaryTreeNode<char> node[100];
	string s;
	cout<<"Input1"<<endl;
	cin>>s;
	for(int i = 0; i < s.length(); i++) {
		binaryTreeNode<char> n(s.at(i));
		node[i] = n;
	}
	linkedBinaryTree<char> tree;
	constructTreeByLevelOrder(node,s.length());
	tree.setSize(s.length());
//	node[0].leftChild = &node[1];
//	node[0].rightChild = &node[2];
//  cout<<"preOrder"<<endl;
//  记录层数,方便输出逗号
	int level = 0;
	cout<<"Output1"<<endl;
//	cout<<node[0].element<<endl;
//	cout<<node[0].leftChild<<endl;
	tree.preOrder(&node[0],level);
	cout<<endl;
	tree.inOrder(&node[0]);
	in = 0;
	cout<<endl;
	tree.postOrder(&node[0]);
	post = 0;
	cout<<endl;
	cout<<tree.size()<<endl;
	cout<<tree.getHeight(&node[0])<<endl;

//	tree.constructTreeByLevelOrder(node,length);
//	tree.inOrder();
//	cout<<2<<node[0].element<<node[0].leftChild->element;
	cout<<"Input2"<<endl;
	string s1,s2;
	cin>>s1>>s2;
	binaryTreeNode<char> node1[100];
	binaryTreeNode<char> node2[100];
	for(int i = 0; i < s1.length(); i++) {
		binaryTreeNode<char> n(s1.at(i));
		node1[i] = n;
	}
	int noting;
	for(int i = 0; i < s2.length(); i++) {
		binaryTreeNode<char> n(s2.at(i));
		node2[i] = n;
		if(s2.at(i) == s1.at(0)) noting = i;
	}
	//constructTreeByPreOrderAndInOrder(node1, node2, s1.length(), s2.length(), noting);
	cout<<"Output2"<<endl;
	create(node1, 0, s1.length()-1, node2, 0, s2.length()-1);
//	tree.preOrder(&node1[0],level);
//	cout<<endl;
//	tree.inOrder(&node1[0]);
//	cout<<endl;
	tree.postOrder(&node1[0]);
	cout<<endl;
	tree.levelOrder(&node1[0]);
	cout<<endl;
	cout<<"End"<<endl;
	return 0;
}

0x05 错误代码

#include<bits/stdc++.h>
using namespace std;
int in = 0;
int post = 0;
int Level = 0;
template<class T>
class binaryTreeNode {
	public:
		T element;
		binaryTreeNode<T> *leftChild,*rightChild;
		binaryTreeNode() {
			leftChild  = rightChild = NULL;
		}
		binaryTreeNode(const T& theElement) : element(theElement) {
			leftChild = rightChild = NULL;
		}
		binaryTreeNode(const T& theElement, binaryTreeNode *theLeftChild, binaryTreeNode *theRightChild):element(theElement) {
			leftChild = theLeftChild;
			rightChild = theRightChild;
		}
};
template<class E>
class linkedBinaryTree {
	public:
		linkedBinaryTree() {
			root = NULL;
			treeSize = 0;
		}
		bool empty() const {
			return treeSize == 0;
		}
		int size() const {
			return treeSize;
		}
		void setSize(int size) {
			treeSize = size;
		}
		void preOrder(binaryTreeNode<E>* node,int level) {
			if(node != NULL) {
				if(level == 0) {
					cout<<node->element;
					preOrder(node->leftChild, ++level);
					preOrder(node->rightChild, ++level);
				} else {
					cout<<","<<node->element;
					preOrder(node->leftChild, ++level);
					preOrder(node->rightChild, ++level);
				}
			}
		}
		void inOrder(binaryTreeNode<E>* node) {
			if(node != NULL) {
				if(node->leftChild == NULL && in == 0) {
					cout<<node->element;
					in++;
				} else {
					inOrder(node->leftChild);
					cout<<","<<node->element;
					inOrder(node->rightChild);
				}

			}
		}
		void postOrder(binaryTreeNode<E>* node) {
			if(node != NULL) {
				if(node->leftChild == NULL && post == 0) {
					cout<<node->element;
					post++;
				} else {
					postOrder(node->leftChild);
					postOrder(node->rightChild);
					cout<<","<<node->element;
				}
			}
		}
		void levelOrder(binaryTreeNode<E>* node) {
			queue<binaryTreeNode<E>*> q;
			while (node != NULL) {
				if(Level == 0) {
					Level++;
					cout<<node->element;
					if(node->leftChild != NULL) q.push(node->leftChild);
					if(node->rightChild != NULL) q.push(node->rightChild);
					node = q.front();
					q.pop();
				} else {
					cout<<","<<node->element;
					if(node->leftChild != NULL) q.push(node->leftChild);
					if(node->rightChild != NULL) q.push(node->rightChild);
					node = q.front();
					q.pop();
				}

			}
		}
		int getHeight(binaryTreeNode<E>* node) {
			if(node == NULL) return 0;
			int h1 = getHeight(node->leftChild);
			int h2 = getHeight(node->rightChild);
			if(h1 > h2) {
				return ++h1;
			} else {
				return ++h2;
			}
		}
	private:
		binaryTreeNode<E> *root;
		int treeSize;
};
template <class E>
binaryTreeNode<E>* constructTreeByLevelOrder(binaryTreeNode<E> node[],int num) {
	queue<binaryTreeNode<E>*> q;
	q.push(&node[0]);
	int i = 1;
	while(i < num) {
//		cout<<"q.front()"<<q.front()<<endl;
//		cout<<"&q.front()"<<&q.front()<<endl;
//		cout<<"node[0]"<<&node[0]<<endl;
//		cout<<"node[0]"<<&node<<endl;
		binaryTreeNode<E>* current = q.front();
		q.pop();
		if(i < num) {
			current->leftChild = &node[i];
//			cout<<current->leftChild->element<<endl;
//			cout<<node[0].leftChild->element<<endl;
			q.push(&node[i]);
		}
		i++;
		if(i < num) {
			current->rightChild = &node[i];
			q.push(&node[i]);
		}
		i++;
	}
	return &node[0];
}
template <class E>
//左子树的实现 
binaryTreeNode<E>* soul(int noting, binaryTreeNode<E> node1[], binaryTreeNode<E> node2[]) {
	int index1 = 100;
	int index2 = 100;
	for(int i = 1; i <= noting; i++) {
		for(int j = noting; j >= 0; j--) {
			if(node1[i].element == node2[j].element) {
				index1 = index2;
				index2 = j;
				cout<<"index1"<<index1<<endl;
				cout<<"index2"<<index2<<endl;
			}
		}
		if(index1 > index2) {
			node1[i-1].leftChild = &node1[i];
		} else {
//			cout<<"Yes"<<endl;
			for(int j = noting; j >= 0; j--) {
				if(node1[i].element == node2[j].element) {
					for(int k = noting; k >= 0; k--) {
						if(node2[j-1].element == node1[k].element) {
							node1[k].rightChild = &node1[i];
						}
					}
				}
			}
		}
	}
	return &node1[0];
}
template <class E>
binaryTreeNode<E>* constructTreeByPreOrderAndInOrder(binaryTreeNode<E> node1[], binaryTreeNode<E> node2[], int num1, int num2, int noting) {
	soul(noting, node1, node2);
	int temp;
	//获取下一个左子树区间 
	for(int i = noting + 1; i < num1; i++) {
		if(node2[i].element == node1[noting+1].element) {
			temp = noting;
			noting = i;
		}
	}
	do {
		//重复操作,直到剩下最后一个元素,或者不剩下元素,退出循环 
		int num = 0;
		binaryTreeNode<char> node3[100];
		binaryTreeNode<char> node4[100];
		for(int i = temp + 1; i <= noting; i++) {
			node3[num] = node1[i];
			node4[num] = node2[i];
			num++;
		}
		soul(noting, node3, node4);
		for(int i = noting + 1; i < num1; i++) {
			if(node2[i].element == node1[noting+1].element) {
				temp = noting;
				noting = i;
			}
		}
	} while(noting + 1 != num1 - 1 && noting + 1 != num1);
	//如果剩一个元素 
	if(noting + 1 == num1 - 1) node2[num1 - 1].rightChild = &node2[num1];
	return &node1[0];
}
int main() {
	//binaryTreeNode<char> *node = new binaryTreeNode<char>[100];
	binaryTreeNode<char> node[100];
	string s;
	cout<<"Input"<<endl;
	cin>>s;
	for(int i = 0; i < s.length(); i++) {
		binaryTreeNode<char> n(s.at(i));
		node[i] = n;
	}
	linkedBinaryTree<char> tree;
	constructTreeByLevelOrder(node,s.length());
	tree.setSize(s.length());
//	node[0].leftChild = &node[1];
//	node[0].rightChild = &node[2];
//  cout<<"preOrder"<<endl;
//  记录层数,方便输出逗号
	int level = 0;
	cout<<"Output"<<endl;
//	cout<<node[0].element<<endl;
//	cout<<node[0].leftChild<<endl;
	tree.preOrder(&node[0],level);
	cout<<endl;
	tree.inOrder(&node[0]);
	in = 0;
	cout<<endl;
	tree.postOrder(&node[0]);
	post = 0;
	cout<<endl;
	cout<<tree.size()<<endl;
	cout<<tree.getHeight(&node[0])<<endl;

//	tree.constructTreeByLevelOrder(node,length);
//	tree.inOrder();
//	cout<<2<<node[0].element<<node[0].leftChild->element;
	cout<<"Input2"<<endl;
	string s1,s2;
	cin>>s1>>s2;
	binaryTreeNode<char> node1[100];
	binaryTreeNode<char> node2[100];
	for(int i = 0; i < s1.length(); i++) {
		binaryTreeNode<char> n(s1.at(i));
		node1[i] = n;
	}
	int noting;
	for(int i = 0; i < s2.length(); i++) {
		binaryTreeNode<char> n(s2.at(i));
		node2[i] = n;
		if(s2.at(i) == s1.at(0)) noting = i;
	}
	constructTreeByPreOrderAndInOrder(node1, node2, s1.length(), s2.length(), noting);
	cout<<"Output2"<<endl;
	tree.preOrder(&node1[0],level);
	cout<<endl;
	tree.inOrder(&node1[0]);
	cout<<endl;
	tree.postOrder(&node1[0]);
	cout<<endl;
	tree.levelOrder(&node1[0]);
	cout<<endl;
	return 0;
}

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

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

相关文章

基于Java SSM框架+Vue实现旅游资源网站项目【项目源码+论文说明】

基于java的SSM框架Vue实现旅游资源网站演示 摘要 本论文主要论述了如何使用JAVA语言开发一个旅游资源网站 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述旅游…

notepad ++ 用法大全【程序员必会高级用法】

目录 1&#xff1a;notepad 介绍 2&#xff1a; 快捷键 3&#xff1a; notepad 实用插件 1&#xff1a;notepad 介绍 notepad是一款免费且开源的文本编辑器&#xff0c;可运行在Windows系统上。它支持多种编程语言&#xff0c;包括C、C、Java、Python等等。Notepad具有许多实…

Qt国际化翻译Linguist使用

QT的国际化是非常方便的&#xff0c;简单的说就是QT有自带的翻译工具把我们源代码中的字符串翻译成任何语言文件&#xff0c;再把这个语言文件加载到项目中就可以显示不同的语言。下面直接上手&#xff1a; 步骤一&#xff1a;打开pro文件&#xff0c;添加&#xff1a;TRANSLA…

Mysql安全之基础合规配置

一、背景 某次某平台进行安全性符合型评估时&#xff0c;列出了数据库相关安全选项&#xff0c;本文特对此记录&#xff0c;以供备忘参考。 二、安全配置 2.1、数据库系统登录时的用户进行身份标识和鉴别&#xff1b; 1&#xff09;对登录Mysql系统用户的密码复杂度是否有要…

MYSQL报错 [ERROR] InnoDB: Unable to create temporary file; errno: 0

起因 服务器的mysql不支持远程访问&#xff0c;在修改完相关配置后重启服务出错。 2023-12-03T10:12:23.895459Z 0 [Note] C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld.exe (mysqld 5.7.22-log) starting as process 15684 ... 2023-12-03T10:12:23.908886Z 0 [Note…

TimiGP细胞互作算法

介绍&#xff1a; 通过推断细胞间相互作用和免疫细胞预后价值来研究时间的计算方法。我们的方法将存活统计数据与批量转录组学图谱相结合&#xff0c;以构建免疫细胞-细胞相互作用网络&#xff0c;其中边缘&#xff08;例如&#xff0c;X → Y&#xff09;表明高 X/Y 比值与良…

unity学习笔记17

一、动画组件 Animation Animation组件是一种更传统的动画系统&#xff0c;它使用关键帧动画。你可以通过手动录制物体在时间轴上的变换来创建动画。 一些重要的属性&#xff1a; 1. 动画&#xff08;Animation&#xff09;&#xff1a; 类型&#xff1a; Animation组件允许…

React如何检查组件性能

可以使用Profiler来查看组件的渲染速度 Profiler的基本使用 需要将<Profiler>标签包裹在需要检查渲染速度的组件外部需要绑定id属性&#xff0c;该属性是唯一标识&#xff0c;用于区分其他Profiler需要onRender函数&#xff0c;该函数一共有六个参数&#xff0c;分别为…

海德汉(HEIDENHAIN)CNC数据采集(可免授权)

一&#xff0c;概述 海德汉 常见的系统一般有530、640系统&#xff0c;采集一般有两种方法&#xff1a; &#xff08;1&#xff09;购买海德汉官方的SDK&#xff0c;HeidenhainDNC COM Component&#xff0c;安装之后有相应的demo&#xff0c;支持的语言有C#、C/C。此方法还需…

蓝桥杯物联网竞赛_STM32L071_8_ADC扩展模块

原理图&#xff1a; 扩展模块原理图&#xff1a; RP1和RP2分别对应着AIN1和AIN2&#xff0c;扭动它们&#xff0c;其对应滑动变阻器阻值也会变化 实验板接口原理图&#xff1a; 对应实验板接口PB1和PB0 即AN1对应PB1, AN2对应PB0 CubMx配置&#xff1a; ADC通道IN8和IN9才对…

牛客在线编程(SQL大厂面试真题)

1.各个视频的平均完播率_牛客题霸_牛客网 ROP TABLE IF EXISTS tb_user_video_log, tb_video_info; CREATE TABLE tb_user_video_log (id INT PRIMARY KEY AUTO_INCREMENT COMMENT 自增ID,uid INT NOT NULL COMMENT 用户ID,video_id INT NOT NULL COMMENT 视频ID,start_time d…

leetcode 142.环形链表2

我来更新 leetcode 题目了&#xff0c;接着上一次&#xff0c;这一次是上一道题目的提升&#xff08;有点数学题的感觉&#xff09; 142.环形链表2 题目 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表…

物奇平台电容触摸功能调试

是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群赠送语音信号处理降噪算法,蓝牙耳机音频,DSP音频项目核心开发资料, 物奇平台电容触摸功能调试 1 修改按键驱动宏 2 编译生成wpk 文件,import 导入烧录文件。…

【Vulnhub靶机】w1r3s.v1.0.1-CuppaCMS

文档说明&#xff1a;https://www.vulnhub.com/entry/w1r3s-101,220/ 靶机下载&#xff1a;Download (Mirror): 信息收集 主机发现 -sn 扫描整个C段&#xff0c;不进行端口扫描&#xff0c;只打印可用主机&#xff0c;n代表not port scan sudo nmap -sn 10.9.75.0/24 -oA su…

关于安科瑞预付费系统在转供电情况下的应用-安科瑞 蒋静

1 前言 国家从2018年开始对转供电加价开展规范清理以来&#xff0c;已经出来了一系列政策&#xff0c;不仅包括专门针对转供电问题的政策&#xff0c;18-20年间还在每次降电价政策中突出强调了转供电主体不得截留降价红利的要求。从具体内容看&#xff0c;各地政策都鼓励一户一…

MATLAB 自抗扰控制 - Active Disturbance Rejection Control

系列文章目录 MATLAB 模型参考自适应控制 - Model Reference Adaptive Control 文章目录 系列文章目录前言一、控制器结构1.1 一阶逼近1.2 二阶逼近 二、指定控制器参数参考 前言 自抗扰控制 (ADRC) 是一种无模型控制方法&#xff0c;适用于为具有未知动态特性以及内部和外部…

React使用TailwindCSS

React中使用TailwindCSS TailwindCSS是 下载及初始化 可以查看官网对照自己使用的框架进行配置 npm install -D tailwindcss postcss autoprefixer下载完毕后执行如下命令 npx tailwindcss init -p可以发现项目中多了两个文件 其中默认已经进行了配置&#xff0c;我们需要将…

AR助推制造业智能转型:实时远程协作与可视化引领生产创新

制造商面临着多方面的变革&#xff0c;技术的兴起催生了工业物联网&#xff08;IIoT&#xff09;&#xff0c;改变了现代工厂的外貌、系统和流程。同时&#xff0c;全球竞争压力和不断变化的员工队伍要求采用新的员工培训方法&#xff0c;并重新审视工人在工厂中的角色。尽管如…

C# Spire操作Excel数据透视表

一、概述 数据透视表&#xff08;Pivot Table&#xff09;是一种交互式的表&#xff0c;可以进行某些计算&#xff0c;如求和与计数等&#xff0c;可动态地改变透视表版面布置&#xff0c;也可以重新安排行号、列标和页字段。当改变版面布置时&#xff0c;数据透视表也会按照新…

Matter学习笔记(3)——交互模型

一、简介 1.1 交互方式 交互模型层定义了客户端和服务器设备之间可以执行哪些交互。发起交互的节点称为发起者&#xff08;通常为客户端设备&#xff09;&#xff0c;作为交互的接收者的节点称为目标&#xff08;通常为服务器设备&#xff09;。 节点通过以下方式进行交互&a…