【数据结构】树的存储结构;树的遍历;哈夫曼树;并查集

  欢~迎~光~临~^_^

目录

1、树的存储结构

1.1双亲表示法

1.2孩子表示法

1.3孩子兄弟表示法

2、树与二叉树的转换

3、树和森林的遍历

3.1树的遍历

3.1.1先根遍历

3.1.2后根遍历

3.2森林的遍历

3.2.1先序遍历森林

3.2.2中序遍历森林

4、树与二叉树的应用

4.1哈夫曼树

4.1.1概念

4.1.2构造哈夫曼树

4.1.3哈夫曼编码

4.1.4C语言实现哈夫曼树

4.2并查集​编辑

4.2.1逻辑结构

4.2.2基本操作

4.2.3存储结构

4.2.4优化


1、树的存储结构

 

1.1双亲表示法

树的双亲表示法是一种简单的树结构表示方法,它在每个结点中存储了该结点的父节点信息。具体地,每个结点包含两部分信息,一部分是该结点的数据,另一部分是该结点的父节点的索引值。根结点没有父节点,通常用一个特定的值来表示。双亲表示法的优点是在访问任意结点的父节点时非常快,但是在查找任意结点的子节点时则需要遍历整棵树来确定其子节点。

例如,下面是一个有6个节点的树的双亲表示法的例子: 

struct TreeNode {int data;      // 节点数据int parent;    // 父节点索引
};TreeNode tree[6];   // 定义一个有6个节点的树,每个节点包含数据和父节点索引两部分信息
tree[0].data = 1;   // 第一个节点的数据是1,它是根节点,没有父节点
tree[1].data = 2;   // 第二个节点的数据是2,它的父节点是根节点,其父节点索引为0
tree[1].parent = 0;
tree[2].data = 3;   // 第三个节点的数据是3,它的父节点是根节点,其父节点索引为0
tree[2].parent = 0;
tree[3].data = 4;   // 第四个节点的数据是4,它的父节点是第二个节点,其父节点索引为1
tree[3].parent = 1;
tree[4].data = 5;   // 第五个节点的数据是5,它的父节点是第二个节点,其父节点索引为1
tree[4].parent = 1;
tree[5].data = 6;   // 第六个节点的数据是6,它的父节点是第三个节点,其父节点索引为2
tree[5].parent = 2;

1.2孩子表示法

树的孩子表示法是一种常用的树的存储方式,它的基本思想是:每个节点都存储它的孩子节点的指针(地址)。

相比于其他树的存储方式,孩子表示法的优点是:

  1. 能够较快地访问节点的孩子节点,因为每个节点都存储了它的孩子节点的指针;

  2. 孩子表示法的存储方式相对简单、直观易懂。

但是,孩子表示法也存在一些缺点:

  1. 孩子节点的数量不固定,因此存储时需要动态分配内存空间;

  2. 访问父节点比较麻烦,需要从根节点开始遍历整棵树才能找到父节点。

1.3孩子兄弟表示法

孩子兄弟表示法是一种树型数据结构中用于表示节点关系的方法,通常用于表示一个树或者一棵森林中的节点之间的关系。

在孩子兄弟表示法中,每个节点包含两个指针:一个指向该节点的第一个孩子节点,另一个指向该节点的下一个兄弟节点。因此,通过这两个指针可以遍历整棵树或森林中的节点,并找到它们的父节点、孩子节点和兄弟节点。

孩子兄弟表示法的主要优点是它能够有效地减少存储空间的使用,因为每个节点只需要存储两个指针,而不需要像其他表示方法那样存储父节点和所有孩子节点的指针。

然而,由于每个节点只存储了两个指针,因此在进行某些操作时,可能需要遍历整棵树或森林,这可能会导致效率较低。

2、树与二叉树的转换

将一棵树转换为二叉树的方法,可以选择先把树转换为森林,然后再对每棵树进行转换。转换的基本思路是:将每个节点的第一个孩子作为其左孩子,将兄弟节点作为其右孩子。

具体实现如下:

1. 首先对树进行先序遍历,从根节点开始遍历。

2. 对于每个节点,如果它有孩子节点,将其第一个孩子节点作为其左孩子。

3. 对于每个节点的兄弟节点,将其作为当前节点右孩子。

4. 对于所有没有孩子节点的节点,将其左孩子和右孩子都设为空。

5. 最终得到的结果是一棵二叉树。

将一棵二叉树转换为一棵树的方法,可以选择先把二叉树转换为森林,然后再将森林中的所有树合并为一棵树。具体实现如下:

1. 针对每个节点,将其左孩子作为其第一个孩子节点,将其右孩子的子树转换为其兄弟节点。

2. 对于每个节点,先将其所有孩子节点合并为一棵子树,然后将其所有兄弟节点依次加入这棵子树中。

3. 最终得到的结果是一棵树。

3、树和森林的遍历

3.1树的遍历

3.1.1先根遍历

树的先根遍历是一种树的遍历方式,先访问根节点,然后依次遍历其子节点,再依次遍历每个子节点的子树的根节点。

 例如,对于下图所示的树:

    A/ \B   C/   / \
D   E   F

先根遍历的顺序是:A -> B -> D -> C -> E -> F。

3.1.2后根遍历

树的后根遍历(也叫后序遍历)是指先访问一个节点的左子树和右子树,最后再访问该节点本身。具体的遍历顺序如下:

  1. 访问该节点的左子树
  2. 访问该节点的右子树
  3. 访问该节点本身

通常,可以使用递归或迭代算法实现树的后根遍历。递归的实现方式比较简单。

迭代的实现方式稍微复杂一些,需要借助栈来实现。具体的算法如下:

  1. 将根节点压入栈中
  2. 如果栈不为空,则取出栈顶节点
  3. 如果该节点没有左右子节点或者其左右子节点已经被访问过,则访问该节点并弹出
  4. 如果该节点有左右子节点且其左右子节点还未被访问,则将其右子节点和左子节点依次压入栈中,保证左右子节点先被访问

3.2森林的遍历

3.2.1先序遍历森林

先序遍历森林是指以任意一棵树的根节点为起点,按照先访问根节点,再依次访问子树的方式遍历整个森林。具体操作如下:

  1. 访问当前节点
  2. 依次以当前节点的子节点为根节点,重复进行上述操作

在实际操作中,可以采用递归或栈的方式实现先序遍历森林。以递归方式为例,实现代码如下:

void preOrderForest(Node* root) {if (root == nullptr) {return;}// 访问当前节点visit(root);// 依次遍历子树for (Node* child : root->children) {preOrderForest(child);}
}

其中,Node代表树节点的数据结构,root表示当前节点,children表示当前节点的子节点列表,visit()表示访问节点的操作。

3.2.2中序遍历森林

森林的后序遍历是将森林中每个树的后序遍历序列依次拼接起来,得到的序列即为森林的后序遍历。

具体步骤如下:

  1. 对每棵树分别进行后序遍历。
  2. 将每棵树的后序遍历序列依次拼接起来,即可得到森林的后序遍历序列。

例如,对以下森林进行后序遍历:

 B    C     D/ \        / \
E   F      G   H

首先分别对三棵树 B-EF、C、D-GH 进行后序遍历,得到它们的后序遍历序列:

B-EF的后序遍历序列为:E F B

C的后序遍历序列为:C

D-GH的后序遍历序列为:G H D

然后将它们依次拼接起来,得到森林的后序遍历序列:E F B C G H D

4、树与二叉树的应用

4.1哈夫曼树

4.1.1概念

哈夫曼树(Huffman Tree)是一种特殊的二叉树,它是一种最优二叉树,常用于数据压缩和编码中。哈夫曼树的构建过程是基于哈夫曼编码的原理,即将出现频率较高的字符用较短的编码,而出现频率较低的字符用较长的编码。哈夫曼树的构建过程是将每个字符作为一个节点,并将它们按照出现频率从小到大排序,然后将频率最小的两个节点合并成一个新的节点,其权值为两个节点的权值之和。重复这个过程,直到所有节点都被合并成为一个根节点为止。最后形成的这个根节点就是哈夫曼树的根节点。哈夫曼树的叶子节点表示原始数据中的字符,而路径上的0、1代表相应的比特位编码。哈夫曼树是一种满足最优化标准的树形结构,可以使编码后的数据更加紧凑,从而达到压缩数据的目的。

 

4.1.2构造哈夫曼树

哈夫曼树是一种带权路径长度最小的树,用于编码和数据压缩。构造哈夫曼树的过程如下:

  1. 将节点按权值从小到大排序,构造n个只含一个节点的二叉树,每个节点代表一个权值。
  2. 选择权值最小的两棵二叉树合并成一棵新二叉树,根节点的权值为这两棵二叉树的权值之和。
  3. 从已选的n棵二叉树中删除这两棵二叉树,将新的二叉树加入到集合中。
  4. 重复步骤2和步骤3,直到只剩下一棵二叉树,这棵树就是哈夫曼树。

4.1.3哈夫曼编码

将字符频次作为字符结点权值,构造哈夫曼树,即可得到哈夫曼编码,可用于数据压缩。

前缀编码:没有一个编码 是另一个编码的前缀

固定长度编码:每个字符用相等长度的二进制位表示

可变长度编码: 允许对不同字符用不等长的二进制位表示

哈夫曼编码的生成过程包括以下几个步骤:

  1. 统计每个字符在数据中出现的频率;
  2. 将每个字符和其对应的频率构建成一个叶子节点;
  3. 构建哈夫曼树,将每个节点按照频率从小到大排序,然后将相邻的两个节点合并成一个新节点,其频率为两个节点的频率之和。重复此过程,直到所有节点都合并为一个根节点;
  4. 给每个叶子节点分配一个编码,从根节点开始,向左走则编码为0,向右走则编码为1,直到到达叶子节点;
  5. 用每个字符的编码替换原始数据中相应的字符,从而得到压缩后的数据。

4.1.4C语言实现哈夫曼树

哈夫曼树是一种应用广泛的数据结构,用于有效地压缩数据。在C语言中,哈夫曼树的实现可以通过以下步骤完成:

1. 定义节点结构体

首先需要定义一个节点结构体,用于表示哈夫曼树中的每个节点。该结构体包含左子树、右子树、权值和字符等信息。

struct HuffmanNode {int weight;                // 权值char ch;                   // 字符struct HuffmanNode *left;  // 左子树struct HuffmanNode *right; // 右子树
};

2. 定义比较函数

比较函数用于在构建哈夫曼树时对节点进行排序。该函数将根据节点的权值大小进行比较。

int cmp(const void *a, const void *b) {const struct HuffmanNode *node1 = a;const struct HuffmanNode *node2 = b;return node1->weight - node2->weight;
}

3. 构建哈夫曼树

构建哈夫曼树的过程可以通过一些简单的步骤完成。首先需要将每个字符作为一个叶子节点插入到优先队列中,然后不断地取出队列中权值最小的两个节点,将它们合并成一个新节点,并将新节点插入到队列中。重复此过程,直到队列中只剩下一个根节点,此时构建的就是哈夫曼树。

struct HuffmanNode *buildHuffmanTree(const char *str) {// 统计字符出现的次数int count[256] = {0};for (int i = 0; i < strlen(str); i++) {count[str[i]]++;}// 将每个字符作为一个叶子节点插入到优先队列中int size = 0;struct HuffmanNode *nodes[256];for (int i = 0; i < 256; i++) {if (count[i] > 0) {nodes[size] = malloc(sizeof(struct HuffmanNode));nodes[size]->ch = (char)i;nodes[size]->weight = count[i];nodes[size]->left = NULL;nodes[size]->right = NULL;size++;}}// 构建哈夫曼树while (size > 1) {// 取出队列中权值最小的两个节点qsort(nodes, size, sizeof(struct HuffmanNode *), cmp);struct HuffmanNode *left = nodes[0];struct HuffmanNode *right = nodes[1];// 合并两个节点struct HuffmanNode *parent = malloc(sizeof(struct HuffmanNode));parent->ch = '\0';parent->weight = left->weight + right->weight;parent->left = left;parent->right = right;// 将新节点插入到队列中nodes[0] = parent;for (int i = 2; i < size; i++) {nodes[i - 1] = nodes[i];}size--;}return nodes[0];
}

4. 遍历哈夫曼树

遍历哈夫曼树可以得到每个字符的编码,即通过左子树走一步为0,右子树走一步为1。在遍历过程中,需要记录下从根节点到当前节点的路径上的字符编码,以便后续使用。

void traverseHuffmanTree(struct HuffmanNode *node, char *code, int depth) {if (node->left == NULL && node->right == NULL) {// 叶子节点,输出编码printf("%c: %s\n", node->ch, code);} else {// 遍历左子树code[depth] = '0';traverseHuffmanTree(node->left, code, depth + 1);// 遍历右子树code[depth] = '1';traverseHuffmanTree(node->right, code, depth + 1);}
}

5. 完整代码

将以上步骤整合起来,可以得到完整的C语言实现代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>struct HuffmanNode {int weight;                // 权值char ch;                   // 字符struct HuffmanNode *left;  // 左子树struct HuffmanNode *right; // 右子树
};int cmp(const void *a, const void *b) {const struct HuffmanNode *node1 = a;const struct HuffmanNode *node2 = b;return node1->weight - node2->weight;
}struct HuffmanNode *buildHuffmanTree(const char *str) {// 统计字符出现的次数int count[256] = {0};for (int i = 0; i < strlen(str); i++) {count[str[i]]++;}// 将每个字符作为一个叶子节点插入到优先队列中int size = 0;struct HuffmanNode *nodes[256];for (int i = 0; i < 256; i++) {if (count[i] > 0) {nodes[size] = malloc(sizeof(struct HuffmanNode));nodes[size]->ch = (char)i;nodes[size]->weight = count[i];nodes[size]->left = NULL;nodes[size]->right = NULL;size++;}}// 构建哈夫曼树while (size > 1) {// 取出队列中权值最小的两个节点qsort(nodes, size, sizeof(struct HuffmanNode *), cmp);struct HuffmanNode *left = nodes[0];struct HuffmanNode *right = nodes[1];// 合并两个节点struct HuffmanNode *parent = malloc(sizeof(struct HuffmanNode));parent->ch = '\0';parent->weight = left->weight + right->weight;parent->left = left;parent->right = right;// 将新节点插入到队列中nodes[0] = parent;for (int i = 2; i < size; i++) {nodes[i - 1] = nodes[i];}size--;}return nodes[0];
}void traverseHuffmanTree(struct HuffmanNode *node, char *code, int depth) {if (node->left == NULL && node->right == NULL) {// 叶子节点,输出编码printf("%c: %s\n", node->ch, code);} else {// 遍历左子树code[depth] = '0';traverseHuffmanTree(node->left, code, depth + 1);// 遍历右子树code[depth] = '1';traverseHuffmanTree(node->right, code, depth + 1);}
}int main() {char str[] = "hello world";struct HuffmanNode *root = buildHuffmanTree(str);char code[256];traverseHuffmanTree(root, code, 0);return 0;
}

4.2并查集

4.2.1逻辑结构

并查集是一种用于处理集合并、查找和判定两个元素是否在同一集合中的数据结构。它的基本操作有初始化、查找、合并等。

并查集的逻辑结构通常由一个数组和若干个操作函数构成。数组中每个元素对应一个集合,它的值表示当前元素所在集合的根节点编号。在初始化时,每个元素都是一个单独的集合,即它的根节点编号为自身。查找操作用于找到某个元素所在集合的根节点编号,它通过递归查找父节点的方式实现路径压缩。合并操作用于合并两个集合,它将其中一个集合的根节点编号设为另一个集合的根节点编号,从而实现两个集合的合并。

并查集的优点是可以快速地进行集合合并和查找,时间复杂度为O(log n)。它常用于解决连通性问题,如判断图是否连通、求无向图的连通分量等。

4.2.2基本操作

并查集是一种用于维护集合的数据结构,通常支持以下操作:

1. MakeSet(x):创建一个新的集合,其中只包含元素 x。

2. Union(x, y):将包含元素 x 和 y 的两个集合合并成一个新集合。

3. Find(x):查找元素 x 所在的集合,并返回该集合的代表元素。

通常还会有一些额外的操作,例如:

4. SizeOf(x):返回包含元素 x 的集合中元素的数量。

5. IsConnected(x, y):判断元素 x 和 y 是否在同一个集合中。

6. CountSets():返回当前并查集中集合的数量。

在实现并查集的过程中,常见的数据结构有数组和树。使用数组实现时,每个元素的值表示其父节点的索引,根节点的父节点值为-1。使用树实现时,每个节点的父节点指向它的父节点。

在 Find(x) 操作中,可以通过递归或迭代的方式将元素 x 所在的集合中的所有元素都指向该集合的代表元素,以达到路径压缩的效果,加快后续对同一集合的 Find 操作的速度。

在 Union(x, y) 操作中,可以选择将一个集合的根节点作为另一个集合的子树,或者将两个集合的根节点合并成一个新的集合。通常建议采用按秩合并和路径压缩(即将深度较浅的树作为深度较深的树的子树)的算法,以保证并查集操作的时间复杂度为 O(α(n)),其中 α(n) 是反阿克曼函数的逆函数,增长极其缓慢,因此在实际应用中可以认为它是一个常数。

4.2.3存储结构

并查集的存储结构可以采用数组或树形结构。常用的是采用树形结构进行存储。 

对于每个元素x,都有一个对应的父结点parent[x],如果x是根结点,则parent[x]=-1。在初始化时,可以将每个元素看成一个独立的集合,即其父节点为其自身。随着不断的合并操作,两个元素所在的集合就会合并成为一棵树。

在合并两个集合时,需要将其中一个集合的根节点的父结点设置为另一个集合的根节点。此时,其中一个树就成为另一个树的子树。

通过路径压缩的技巧,可以使得树形结构更加扁平化,从而提高查询效率。具体而言,在查找某个元素所在的集合时,可以沿途将路径上的节点的父节点都设置为该集合的根节点,从而将树的高度降低,进一步提高查询效率。

4.2.4优化

并查集是一种数据结构,用于解决集合的合并和查询问题。在对大量数据进行操作时,为了提高效率,需要对并查集进行优化。

以下是一些并查集的优化方法:

1. 路径压缩:在 find 操作时,将路径上的所有节点都直接连接到根节点上,从而缩短查找路径的长度,减少操作的时间复杂度。

2. 按秩合并:在合并两个集合时,将高度低的集合合并到高度高的集合中,从而保持树的平衡,减少操作的时间复杂度。

3. 路径分裂:在路径压缩时,不仅将路径上的所有节点直接连接到根节点上,还可以将路径上的每个节点的父节点指向其祖先节点的子节点,从而减少路径压缩导致的树的深度增加。

4. 路径减半:在路径压缩时,不仅将路径上的所有节点直接连接到根节点上,还可以将路径上每隔一个节点的父节点指向其祖先节点的父节点,从而减少路径压缩导致的树的深度增加。

🤞❤️🤞❤️🤞❤️树与二叉树的知识点总结就到这里啦,如果对博文还满意的话,劳烦各位看官动动“发财的小手”留下您对博文的赞和对博主的关注吧🤞❤️🤞❤️🤞❤️

 

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

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

相关文章

【Linux网络编程】Socket-TCP实例

该代码利用socket套接字建立Tcp连接&#xff0c;包含服务器和客户端。当服务器和客户端启动时需要把端口号或ip地址以命令行参数的形式传入。服务器启动如果接受到客户端发来的请求连接&#xff0c;accept函数会返回一个打开的socket文件描述符&#xff0c;区别于监听连接的lis…

【校招VIP】前端网络之路由选择协议

考点介绍 当两台非直接连接的计算机需要经过几个网络通信时&#xff0c;通常就需要路由器。路由器提供一种方法来开辟通过一个网状联结的路径。在图R-9中标示了几条存在于洛杉矶和纽约办公室的路径。这种网状网络提供了冗余路径以调整通信负载或倒行链路&#xff0c;通常有一条…

灰狼算法优化ICEEMDAN参数,四种适应度函数任意切换,最小包络熵、样本熵、信息熵、排列熵...

今天给大家带来一期由灰狼算法优化ICEEMDAN参数的MATLAB代码。 优化ICEEMDAN参数的思想可以参考该文献&#xff1a; [1]陈爱午,王红卫.基于HBA-ICEEMDAN和HWPE的行星齿轮箱故障诊断[J].机电工程,2023,40(08):1157-1166. 文献原文提到&#xff1a;由于 ICEEMDAN 方法的分解效果取…

【数据结构】队列知识点总结--定义;基本操作;队列的顺序实现;链式存储;双端队列;循环队列

欢迎各位看官^_^ 目录 1.队列的定义 2.队列的基本操作 2.1初始化队列 2.2判断队列是否为空 2.3判断队列是否已满 2.4入队 2.5出队 2.6完整代码 3.队列的顺序实现 4.队列的链式存储 5.双端队列 6.循环队列 1.队列的定义 队列&#xff08;Queue&#xff09;是一种先…

Vue3记录

Vue3快速上手 1.Vue3简介 2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff09;耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址&#xff1a;https://github.com/vuejs/vue-next/releas…

软件需求怎么写?

前言&#xff1a;一般来说&#xff0c;软件产品的需求人员的主要输出物就是软件需求&#xff0c;如果这个软件产品就XX系统&#xff0c;人们口中的“系统需求”和“软件需求”就没有什么区别了。在车企行业&#xff0c;推行这ASPICE体系&#xff0c;在这个体系中明确申请了系统…

DMNet复现(一)之数据准备篇:Density map guided object detection in aerial image

一、生成密度图 密度图标签生成 采用以下代码&#xff0c;生成训练集密度图gt&#xff1a; import cv2 import glob import h5py import scipy import pickle import numpy as np from PIL import Image from itertools import islice from tqdm import tqdm from matplotli…

哈希及哈希表的实现

目录 一、哈希的引入 二、概念 三、哈希冲突 四、哈希函数 常见的哈希函数 1、直接定址法 2、除留余数法 五、哈希冲突的解决 1、闭散列 2、开散列 一、哈希的引入 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找…

浅析三维模型3DTile格式轻量化处理常见问题与处理措施

浅析三维模型3DTile格式轻量化处理常见问题与处理措施 三维模型3DTile格式的轻量化处理是大规模三维地理空间数据可视化的关键环节&#xff0c;但在实际操作过程中&#xff0c;往往会遇到一些问题。下面我们来看一下这些常见的问题以及对应的处理措施。 变形过大&#xff1a;压…

Vue入门--vue的生命周期

一.什么是Vue 二.Vue的简介 官方网址 特点 三. 前后端的分离 重大问题 优势 4.Vue入门 定义一个管理边界 ​编辑 测试结果 vue的优势 ​编辑 测试结果 5.Vue的生命周期 vue的生命周期图 ​编辑建立一个html 测试结果 一.什么是Vue Vue是一种流行的JavaScript前端框…

【Graph Net学习】GNN/GCN代码实战

一、简介 GNN&#xff08;Graph Neural Network&#xff09;和GCN&#xff08;Graph Convolutional Network&#xff09;都是基于图结构的神经网络模型。本文目标就是打代码基础&#xff0c;未用PyG&#xff0c;来扒一扒Graph Net两个基础算法的原理。直接上代码。 二、代码 …

无涯教程-JavaScript - MDETERM函数

描述 MDETERM函数返回数组的矩阵行列式。 语法 MDETERM (array)争论 Argument描述Required/OptionalArrayA numeric array with an equal number of rows and columns.Required Notes 数组可以作为单元格范围给出,如A1:C3;作为数组常量,如{1,2,3; 4,5,6; 7,8,9}&#xff1…

【刷题】蓝桥杯

蓝桥杯2023年第十四届省赛真题-平方差 - C语言网 (dotcpp.com) 初步想法&#xff0c;x y2 − z2&#xff08;yz)(y-z) 即xa*b&#xff0c;ayz&#xff0c;by-z 2yab 即ab是2的倍数就好了。 即x存在两个因数之和为偶数就能满足条件。 但时间是&#xff08;r-l&#xff09;*x&am…

服务网格和微服务架构的关系:理解服务网格在微服务架构中的角色和作用

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

郑州大学图书馆许少辉《乡村振兴战略下传统村落文化旅游设计》中文文献——2023学生开学季辉少许

郑州大学图书馆许少辉《乡村振兴战略下传统村落文化旅游设计》中文文献——2023学生开学季辉少许

六、串口通信

六、串口通信 串口接口介绍使用串口向电脑发送数据电脑发送数据控制LED灯 串口接口介绍 SBUF是串口数据缓存器&#xff0c;物理上是两个独立的寄存器&#xff0c;但占用相同的地址。写操作时&#xff0c;写入的是发送寄存器&#xff1b;读操作时&#xff0c;读出的是接收寄存器…

【uniapp】Dcloud的uni手机号一键登录,具体实现及踩过的坑,调用uniCloud.getPhoneNumber(),uni.login()等

一键登录Dcloud官网请戳这里&#xff0c;感兴趣的可以看看官网&#xff0c;有很详细的示例&#xff0c;选择App一键登录&#xff0c;可以看到一些常用的概述 比如&#xff1a; 1、调用uni.login就能弹出一键登录的页面 2、一键登录的流程&#xff0c;可以选择先预登录uni.prelo…

数据库----数据查询

1.6 查询语句 语法&#xff1a;select [选项] 列名 [from 表名] [where 条件] [group by 分组] [order by 排序][having 条件] [limit 限制]1.6.1 字段表达式 mysql> select 锄禾日当午; ------------ | 锄禾日当午 | ------------ | 锄禾日当午 | ---…

C++---多态

多态 前言多态的概念多态的定义及实现多态的构成条件虚函数虚函数的重写虚函数重写的两个例外协变(基类与派生类虚函数返回值类型不同)析构函数的重写 override和final 虚函数的默认参数 抽象基类 前言 在买火车票的时候&#xff0c;如果你是学生&#xff0c;是买半价票&#…

微服务保护-Sentinel

初识Sentinel 雪崩问题及解决方案 雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微服务。 如图&#xff0c;如果服务提供者I发生了故障&#xff0c;当前的应用的部分业务因为依赖于服务I&#xff0c;因此也会被阻塞。此时&a…