C学习(数据结构)-->实现链式结构二叉树

news2024/11/28 14:52:31

目录

一、链式二叉树结构

 二、实现

1、申请新结点

2、前、中、后序遍历

1)前序遍历

例:

2)中序遍历

3)后序遍历

 3、结点个数

1)二叉树结点个数

 例:​编辑

2)二叉树叶子结点个数

3)二叉树第k层结点个数

​编辑 4、二叉树深度

例: 

5、寻找值为x的结点

6、二叉树的销毁

三、其它

0、注意:

1、层序遍历

例:​编辑

当前队列初始化后为空队列

首先入队列

然后如果队列不为空则进入循环

 退出循环,层序遍历完成

2、判断是否为完全二叉树

四、总代码

队列  

链式二叉树

Tree.h

Tree.cpp

main.cpp


一、链式二叉树结构

//定义二叉树的链式结构
typedef int BTDataType;

typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;

 二、实现

1、申请新结点

//申请二叉树结点
BTNode* BuyNode(BTDataType x)
{
	BTNode* newNode = (BTNode*)malloc(sizeof(BTNode));
	if (newNode == NULL)
	{
		perror("malloc fail!!!");
		exit(1);
	}
	newNode->data = x;
	newNode->left = newNode->right = NULL;
	return newNode;
}

2、前、中、后序遍历

1)前序遍历

前序遍历的遍历顺序是:根结点-->左孩子结点-->右孩子结点

//前序遍历--根左右
void PreOrder(BTNode* root)
{
	if (root == NULL)//判空
	{
		return;
	}
	printf("%d ", root->data);//打印根结点
	PreOrder(root->left);//遍历左孩子结点
	PreOrder(root->right);//遍历右孩子结点
}
例:

一个链式二叉树

首先 1 作为根节点,遍历根结点,且打印根节点

打印完后,再向左孩子结点遍历,即标号为 2 的结点

标号为 2 的结点作为新的根结点,遍历 2 结点,且打印

然后遍历 2 结点的左孩子结点,即标号为 4 的结点

标号为 4 的结点作为新的根结点,遍历 4 结点,且打印

 

遍历 4 结点的左孩子结点,即为为NULL

 

应为是NULL,所以返回,然后遍历4 结点的右孩子结点,也是NULL

 

 4 结点的右孩子结点,也是NULL,所以返回。

此时4结点已经遍历完,放回 2 结点,因为 4 结点是 2 结点的左孩子结点,开始遍历 2 结点的右孩子结点,即标号为 6 的结点

遍历完 6 结点,再次返回 2 结点,此时 2 结点的左右孩子结点都遍历完,所以返回 1 结点,此时 1 结点的左孩子结点已经遍历完成,则遍历1 结点的右孩子结点,即 3 结点

 此时整个链式二叉树已经遍历完成,打印顺序为:1 2 4 5 3 6

2)中序遍历

 中序遍历的顺序:是左孩子结点-->根节点-->右孩子结点

//中序遍历--左根右
void InOrder(BTNode* root)
{
	if (root == NULL)//判空
	{
		return;
	}
	InOrder(root->left);//遍历左孩子结点
	printf("%d ", root->data);//打印根结点
	InOrder(root->right);//遍历右孩子结点
}

以前序遍历为例,易得中序遍历的打印顺序为:4 2 5 1 6 3

3)后序遍历

后序遍历的遍历顺序为:左孩子结点-->右孩子结点-->根节点

//后序遍历--左右根
void PostOrder(BTNode* root)
{
	if (root == NULL)//判空
	{
		return;
	}
	PostOrder(root->left);//遍历左孩子结点
	PostOrder(root->right);//遍历右孩子结点
	printf("%d ", root->data);//打印根结点
}

 以前序遍历为例,易得后序遍历的打印顺序为:4 5 2 6 3 1

 3、结点个数

1)二叉树结点个数

//二叉树结点个数
int BinaryTreeSize(BTNode* root)
{
	if (root == NULL)//判空
	{
		return 0;//当结点为空时返回 0 
	}
    //该节点不是空结点,返回 1 + 递归左右孩子结点返回的个数
	return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}
 例:

 所以二叉树的结点个数为 6 

2)二叉树叶子结点个数

//二叉树叶子结点个数
int BinaryTreeLeafSize(BTNode* root)
{
	if (root == NULL)//判空
	{
		return 0;//结点为空时返回 0 
	}
	if (root->left == NULL && root->right == NULL)//判读叶子结点
	{
		return 1;//该结点是叶子结点返回 1
	}
    //当该节点既不是空结点也不是叶子结点时,返回递归左右孩子结点返回的个数
	return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}

易得该二叉树叶子结点个数为 3 

3)二叉树第k层结点个数

//二叉树第k层结点个数
int BinaryTreeLexelKSize(BTNode* root, int k)
{
	if (root == NULL)//判空,空结点返回 0
	{
		return 0;
	}
	if (k == 1)// k 的递归是递减的,当 k == 1 时,即到达第 k 层,返回 1
	{
		return 1;
	}
    //即不是第 k 层,也不是空结点,返回递归左右孩子结点得到的数
	return BinaryTreeLexelKSize(root->left, k - 1) + BinaryTreeLexelKSize(root->right, k - 1);
}

 例:求第二层结点个数

 4、二叉树深度

//二叉树的深度/高度
int BinaryTreeDepth(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
    //保存递归左右孩子结点返回的数
	int leftDep = BinaryTreeDepth(root->left);
	int rightDep = BinaryTreeDepth(root->right);
    //比较左右孩子结点返回的数大小,满足条件返回 1 + leftdep,否则 1 + rightDep
	return leftDep > rightDep ? 1 + leftDep : 1 + rightDep;
}

例: 

所以该二叉树的深度为 3  

5、寻找值为x的结点

//二叉树寻找值为x的结点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
	//如果结点为空
	if (root == NULL)
	{
		return NULL;
	}
	if (root->data == x)//找到该x值返回该结点地址
	{
		return root;
	}

	BTNode* leftFind = BinaryTreeFind(root->left, x);//保存递归返回的结点地址
	if (leftFind)//结点地址不为空,只有找到 x 值才不为空
	{
		return leftFind;//返回的结点地址
	}
	BTNode* rightFind = BinaryTreeFind(root->right, x);//保存递归返回的结点地址
	if (rightFind)//结点地址不为空,只有找到 x 值才不为空
	{
		return rightFind;//返回的结点地址
	}

	//x值找不到
	return NULL;
}

6、二叉树的销毁

类似后序遍历

//二叉树的销毁
void BinaryTreeDestory(BTNode** root)
{
	if (*root == NULL)
	{
		return;
	}
	BinaryTreeDestory(&((*root)->left));
	BinaryTreeDestory(&((*root)->right));
	free(*root);
	*root = NULL;
}

三、其它

0、注意:

需要用到队列,具体到C学习(数据结构)-->队列_cpp 队列-CSDN博客

需要将队列的

typedef int QDataType;

改为

typedef struct BinaryTreeNode* QDataType;

1、层序遍历

//层序遍历,借用队列来实现
void LevelOrder(BTNode* root)
{
	Qu q;
	//初始化
	QueueInit(&q);
	//入队列
	QueuePush(&q, root);
	while (!QueueEmpty(&q))//判空
	{
		BTNode* front = QueueFront(&q);//取队头数据
		printf("%d ", front->data);//打印队头数据
		//出队列
		QueuePop(&q);
		if (front->left)//如果该结点的左孩子结点不为空
		{
			QueuePush(&q, front->left);//入队列
		}
		if (front->right)//如果该结点的右孩子结点不为空
		{
			QueuePush(&q, front->right);//入队列
		}
	}
	//销毁队列
	QueueDestroy(&q);
}

例:

当前队列初始化后为空队列

首先入队列
	//入队列
	QueuePush(&q, root);

然后如果队列不为空则进入循环

while (!QueueEmpty(&q))//判空
{
	BTNode* front = QueueFront(&q);//取队头数据
	printf("%d ", front->data);//打印队头数据
	//出队列
	QueuePop(&q);
	if (front->left)//如果该结点的左孩子结点不为空
	{
		QueuePush(&q, front->left);//入队列
	}
	if (front->right)//如果该结点的右孩子结点不为空
	{
			QueuePush(&q, front->right);//入队列
	}
}

重复通过取队头数据,入队列,出队列来层序遍历二叉树

 退出循环,层序遍历完成

2、判断是否为完全二叉树

//用队列判断是否为完全二叉树
bool BinaryTreeComplete(BTNode* root)
{
	Qu q;
	//初始化
	QueueInit(&q);
	//入队列
	QueuePush(&q, root);
	while (!QueueEmpty(&q))//判空
	{
		BTNode* front = QueueFront(&q);
		QueuePop(&q);//出队列
		if (front == NULL)//判空
		{
			break;
		}
		//入队列
		QueuePush(&q, front->left);
		QueuePush(&q, front->right);
	}
	//队列不一定为空
	while (!QueueEmpty(&q))
	{
		BTNode* front = QueueFront(&q);
		QueuePop(&q);
		if (front != NULL)
		{
			QueueDestroy(&q);
			return false;
		}
	}

	QueueDestroy(&q);
	return true;
}

与层序遍历类似,不同的是,取消了判断左右孩子结点是否为空结点,所以就算左右孩子结点为空值结点也会入队列,所以不完全二叉树会出现这种情况

	//入队列
	QueuePush(&q, root);
	while (!QueueEmpty(&q))//判空
	{
		BTNode* front = QueueFront(&q);
		QueuePop(&q);//出队列
		if (front == NULL)//判空
		{
			break;
		}
		//入队列
		QueuePush(&q, front->left);
		QueuePush(&q, front->right);
	}

 当出队列的结点为空结点时退出循环,此时队列不为空,进入另一个循环

	//队列不一定为空
	while (!QueueEmpty(&q))
	{
		BTNode* front = QueueFront(&q);
		QueuePop(&q);
		if (front != NULL)
		{
			QueueDestroy(&q);
			return false;
		}
	}	
    QueueDestroy(&q);
    return true;

通过判断队列里是否还有空值来判断是否是完全二叉树

 

四、总代码

队列  

queue.h

queue.cpp

 具体到C学习(数据结构)-->队列_cpp 队列-CSDN博客

需要将队列的

typedef int QDataType;

改为

typedef struct BinaryTreeNode* QDataType;

链式二叉树

Tree.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>

//定义二叉树的链式结构
typedef int BTDataType;

typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;
//前序遍历--根左右
void PreOrder(BTNode* root);
//中序遍历--左根右
void InOrder(BTNode* root);
//后序遍历--左右根
void PostOrder(BTNode* root);
//二叉树结点个数
int BinaryTreeSize(BTNode* root);	
//二叉树叶子结点个数
int BinaryTreeLeafSize(BTNode* root);
//二叉树第k层结点个数
int BinaryTreeLexelKSize(BTNode* root, int k);
//二叉树的深度/高度
int BinaryTreeDepth(BTNode* root);
//二叉树寻找值为x的结点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x);
//二叉树的销毁
void BinaryTreeDestory(BTNode** root);
//层序遍历,借用队列来实现
void LevelOrder(BTNode* root);
//用队列判断是否为完全二叉树
bool BinaryTreeComplete(BTNode* root);
//申请二叉树结点
BTNode* BuyNode(BTDataType x);

Tree.cpp

#include"Tree.h"
#include"Queue.h"

//前序遍历--根左右
void PreOrder(BTNode* root)
{
	if (root == NULL)
	{
		return;
	}
	printf("%d ", root->data);
	PreOrder(root->left);
	PreOrder(root->right);
}

//中序遍历--左根右
void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		return;
	}
	InOrder(root->left);
	printf("%d ", root->data);
	InOrder(root->right);
}

//后序遍历--左右根
void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		return;
	}
	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", 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层结点个数
int BinaryTreeLexelKSize(BTNode* root, int k)
{
	if (root == NULL)
	{
		return 0;
	}
	if (k == 1)
	{
		return 1;
	}
	return BinaryTreeLexelKSize(root->left, k - 1) + BinaryTreeLexelKSize(root->right, k - 1);
}

//二叉树的深度/高度
int BinaryTreeDepth(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	int leftDep = BinaryTreeDepth(root->left);
	int rightDep = BinaryTreeDepth(root->right);
	return leftDep > rightDep ? 1 + leftDep : 1 + rightDep;
}

//二叉树寻找值为x的结点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
	//如果结点为空
	if (root == NULL)
	{
		return NULL;
	}
	if (root->data == x)
	{
		return root;
	}

	BTNode* leftFind = BinaryTreeFind(root->left, x);
	if (leftFind)
	{
		return leftFind;
	}
	BTNode* rightFind = BinaryTreeFind(root->right, x);
	if (rightFind)
	{
		return rightFind;
	}

	//x值找不到
	return NULL;
}

//二叉树的销毁
void BinaryTreeDestory(BTNode** root)
{
	if (*root == NULL)
	{
		return;
	}
	BinaryTreeDestory(&((*root)->left));
	BinaryTreeDestory(&((*root)->right));
	free(*root);
	*root = NULL;
}

//层序遍历,借用队列来实现
void LevelOrder(BTNode* root)
{
	Qu q;
	//初始化
	QueueInit(&q);
	//入队列
	QueuePush(&q, root);
	while (!QueueEmpty(&q))//判空
	{
		BTNode* front = QueueFront(&q);//取队头数据
		printf("%d ", front->data);
		//出队列
		QueuePop(&q);
		if (front->left)
		{
			QueuePush(&q, front->left);
		}
		if (front->right)
		{
			QueuePush(&q, front->right);
		}
	}
	//如果队列为空,就销毁队列
	QueueDestroy(&q);
}

//用队列判断是否为完全二叉树
bool BinaryTreeComplete(BTNode* root)
{
	Qu q;
	//初始化
	QueueInit(&q);
	//入队列
	QueuePush(&q, root);
	while (!QueueEmpty(&q))//判空
	{
		BTNode* front = QueueFront(&q);
		QueuePop(&q);//出队列
		if (front == NULL)//判空
		{
			break;
		}
		//入队列
		QueuePush(&q, front->left);
		QueuePush(&q, front->right);
	}
	//队列不一定为空
	while (!QueueEmpty(&q))
	{
		BTNode* front = QueueFront(&q);
		QueuePop(&q);
		if (front != NULL)
		{
			QueueDestroy(&q);
			return false;
		}
	}

	QueueDestroy(&q);
	return true;
}

//申请二叉树结点
BTNode* BuyNode(BTDataType x)
{
	BTNode* newNode = (BTNode*)malloc(sizeof(BTNode));
	if (newNode == NULL)
	{
		perror("malloc fail!!!");
		exit(1);
	}
	newNode->data = x;
	newNode->left = newNode->right = NULL;
	return newNode;
}

main.cpp

#include"Tree.h"
#include"Queue.h"

void test01()
{
	BTNode* node1 = BuyNode(1);
	BTNode* node2 = BuyNode(2);
	BTNode* node3 = BuyNode(3);
	BTNode* node4 = BuyNode(4);
	BTNode* node5 = BuyNode(5);
	BTNode* node6 = BuyNode(6);

	node1->left = node2;
	node1->right = node3;
	node2->left = node4;
	node2->right = node5;
	node3->left = node6;

	printf("前序遍历:");
	PreOrder(node1);
	printf("\n");
	printf("中序遍历:");
	InOrder(node1);
	printf("\n");
	printf("后序遍历:");
	PostOrder(node1);
	printf("\n");

	printf("二叉树结点个数:%d\n", BinaryTreeSize(node1));
	printf("二叉树叶子结点个数:%d\n", BinaryTreeLeafSize(node1));
	printf("二叉树第k层结点个数:%d\n", BinaryTreeLexelKSize(node1, 2));
	printf("二叉树的深度/高度:%d\n", BinaryTreeDepth(node1));

	BTNode* find = BinaryTreeFind(node1, 5);
	printf("二叉树寻找值为x的结点:%d\n", find->data);

	printf("层序遍历:");
	LevelOrder(node1);
	printf("\n");

	//判断是否为完全二叉树
	printf("%s\n", BinaryTreeComplete(node1) == true ? "是完全二叉树" : "不是完全二叉树");

	//二叉树的销毁
	BinaryTreeDestory(&node1);
}

int main()
{
	test01();
	return 0;
}

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

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

相关文章

C++入门基础知识27

成长路上不孤单&#x1f60a;【14后小学生一枚&#xff0c;C爱好者&#xff0c;持续分享所学&#xff0c;如有需要欢迎收藏转发&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#xff08;&#xff01;&#xff01;&#xff01…

工厂老板、设计师怎么选通风采光天窗?重点关注哪些方面?

选通风采光天窗首先看预算与通风采光需求&#xff0c;然后看品牌和售后&#xff0c;选购过程中重点关注天窗的型号、规格尺寸、材料配置、外观造型及颜色。一、预算与通风采光需求 通风采光天窗已成为厂房建筑上必备的屋顶设备&#xff0c;现目前天窗的型号多样&#xff0c;价位…

原神4.8版本重点培养和抽到角色数据表:修改了添加倒计时.隐藏了抽到角色数据表删除按钮、备注列和选择列

<!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>原神4.8版本抽到角色和重点培养数据表</title…

七牛云 CDN 视频瘦身,为视频分发「减负增效」

随着智能设备的普及&#xff0c;以及各种以分享视频为主的平台的兴起&#xff0c;人们记录生活、分享故事的方式不再局限于文字和图片&#xff0c;而是越来越多地通过视频来表达。视频也不再需要复杂的制作过程&#xff0c;变得随手可得。 然而&#xff0c;视频在互联网上的爆炸…

mac os 外接设备使用win习惯快捷键

目录 1. 简单映射版本&#xff08;常用快捷键&#xff09;2. 如果想追求完全的win匹配3. 关于外接鼠标滚动设置 1. 简单映射版本&#xff08;常用快捷键&#xff09; 就把ctrl和Command键互换一下就行 点击设置-键盘-键盘快捷键 然后在修饰键中&#xff0c;将control和comm…

怎么恢复电脑删除的文件?全面指南助你找回宝贵数据

在数字化时代&#xff0c;电脑中的文件承载着我们的工作成果、学习资料、珍贵照片以及无数回忆。然而&#xff0c;不小心删除重要文件的情况时有发生&#xff0c;让人心急如焚。别担心&#xff0c;本文将为你提供一份全面的指南&#xff0c;教你如何恢复电脑中删除的文件&#…

虚幻5|AI视力系统,听力系统,预测系统(2)听力系统

虚幻5|AI视力系统&#xff0c;听力系统&#xff0c;预测系统&#xff08;1&#xff09;视力系统-CSDN博客 一&#xff0c;把之前的听力系统&#xff0c;折叠成函数&#xff0c;复制粘贴一份改名为听力系统 1.小个体修改如下&#xff0c;把之前的视力系统改成听力系统 2.整体修…

Java—Lambda表达式

注意&#xff1a;如果无法判断一个方法是否为函数式接口&#xff0c;可以查看该方法的源码中是否携带FunctionalInterface注解。 lambda表达式再简化写法规则如下。 1. 参数类型可以省略不写 2. 如果只有一个参数&#xff0c;参数的 "( )" 也可以省略。 3. 如果Lambd…

使用Java和XPath在XML文档中精准定位数据

在当今数据驱动的世界中&#xff0c;能够从复杂的文档结构中准确地提取信息是一项极具价值的技能。XML文档因其结构化和可扩展性广泛用于各种应用中&#xff0c;而XPath则是一种强大而灵活的语言&#xff0c;专门用于在这些文档中进行导航和数据提取。本篇文章将带您深入了解如…

Android Studio 动态表格显示效果

最终效果 一、先定义明细的样式 table_row.xml <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_h…

【YOLO家族】Scaled-YOLOv4, Optimal Speed and Accuracy of Object Detection,CVPR 2021

资源 论文题目《YOLOv4: Optimal Speed and Accuracy of Object Detection》 论文地址&#xff1a;https://arxiv.org/abs/2004.10934 论文代码&#xff1a;https://github.com/AlexeyAB/darknet 作者&#xff1a;AlexeyAB 论文链接&#xff1a;https://arxiv.org/pdf/2004.10…

通过Spring Boot创建项目

目录 引言 一、创建新项目 二、通过spring boot创建顾客查询的项目 1.实体类: 2.mapper接口 3.service服务层接口 4.service服务层接口实现类 5.mapper映射文件 三、可能遇到的问题 引言 在通过之前ssm框架的学习后&#xff0c;你是否会感觉ssm的配置过多&#xff0c…

Github文件夹重命名|编程tips·24-08-22

小罗碎碎念 这篇推文来解决一个问题&#xff0c;**我上传代码带Github以后&#xff0c;想要修改文件夹的名称怎么办&#xff1f;**例如&#xff0c;我要将文件夹24-08-22修改为联接散点图&#xff5c;24-08-22&#xff0c;可以遵循以下操作。 一、配置SSH 先登录github&#x…

【PyTorch】关于torchvision中的数据集以及dataloader的使用

前提文章目录 【PyTorch】深度学习PyTorch环境配置及安装【详细清晰】 【PyTorch】深度学习PyTorch加载数据 【PyTorch】关于Tensorboard的简单使用 【PyTorch】关于Transforms的简单使用 文章目录 前提文章目录数据集简介程序中下载数据集读取数据集结合transform进行读取数据…

【C++贪心】2498. 青蛙过河 II

本文涉及知识点 贪心 优化后不需要二分 LeetCode2498. 青蛙过河 II 给你一个下标从 0 开始的整数数组 stones &#xff0c;数组中的元素 严格递增 &#xff0c;表示一条河中石头的位置。青蛙一开始在第一块石头上&#xff0c;它想到达最后一块石头&#xff0c;然后回到第一块…

使用分布式锁解决IM聊天数据重复插入的问题

导航 业务背景问题分析与定位探索可行的解决方案 数据库层面处理——唯一索引应用程序层面处理——分布式锁 分布式锁概述 分布式锁需要具备哪些特性&#xff1f;分布式锁有哪些实现方式&#xff1f; 基于数据库的实现方式基于Redisson实现方式 Redission介绍 概述可重入锁 基…

STM32G474的HRTIM用作时基定时器

STM32G474的HRTIM由7个定时器组成&#xff0c;分别是主定时器&#xff0c;定时器A&#xff0c;定时器B&#xff0c;定时器C&#xff0c;定时器D&#xff0c;定时器E和定时器F&#xff0c;每个定时器均可单独配置&#xff0c;独立工作。每个定时器都有1个独立的计数器和4个独立的…

九泰智库 | 医械周刊- Vol.51

⚖️ 法规动态 白内障人工晶体类医用耗材集采落地&#xff0c;平均降幅60% 湖北省自7月10日起实施人工晶体类医用耗材集中带量采购政策&#xff0c;中选产品平均降幅达60%&#xff0c;显著减轻了患者经济负担。此举是国家组织医用耗材采购的一部分&#xff0c;旨在通过集中采购…

MES软件实施:解锁企业数字化转型的无限潜能

MES&#xff08;制造执行系统&#xff09;软件实施是企业数字化转型的重要一环&#xff0c;它确实能够解锁企业数字化转型的无限潜能。以下是对这一主题的详细分析&#xff1a; 一、MES软件的核心价值 集成与协同&#xff1a; MES软件能够集成企业内的各种生产数据和设备&…

企业市值排名3D可视化,重塑商业版图新维度

在这个数据驱动的时代&#xff0c;每一个数字背后都蕴藏着无限的可能与机遇。企业市值&#xff0c;作为衡量企业综合实力与市场认可度的关键指标&#xff0c;其动态变化不仅是投资者关注的焦点&#xff0c;也是全球商业竞争格局的晴雨表。 当枯燥的数据表格被转化为生动的3D场景…