【算法】红黑树

一、红黑树介绍

红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。

红黑树是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。

红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的:它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。

红黑树的每个红色结点的两个子结点都是黑色,从任一结点到其每个叶子的所有路径都包含相同数目的黑色结点。

以上信息仅供参考,建议查阅专业书籍或者咨询专业人士了解更多信息。

二、红黑树在什么情况下会变得不平衡

红黑树在以下情况下会变得不平衡:

  1. 插入操作:当插入一个新的节点时,如果插入后的树不再满足红黑树的定义,那么树就会变得不平衡。例如,新插入的节点颜色为红色,而它的父节点颜色也为红色,这就会违反红黑树的定义,导致树变得不平衡。
  2. 删除操作:当删除一个节点时,如果删除后的树不再满足红黑树的定义,那么树也会变得不平衡。例如,当删除一个红色节点后,其父节点也必须为红色,但如果其父节点也是红色,那么就会违反红黑树的定义,导致树变得不平衡。

为了保持红黑树的平衡性,需要在插入和删除操作时进行一些特定的调整。这些调整包括重新着色节点和重新排列树结构,以确保红黑树的平衡性得到维护。

三、红黑树的定义是什么

红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构。它是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。

红黑树满足以下性质:

  1. 每个节点要么是红色,要么是黑色。
  2. 根节点是黑色。
  3. 每个叶节点(NIL节点,空节点)是黑色。
  4. 如果一个节点是红色的,则它的两个子节点都是黑色。
  5. 从任一节点到其每个叶节点的所有路径都包含相同数目的黑色节点。

以上信息仅供参考,建议查阅专业书籍或者咨询专业人士了解更多信息。

四、红黑树和AVL树有哪些区别

红黑树和AVL树的区别主要体现在以下几个方面:

  1. 平衡的实现机制:红黑树通过颜色和旋转来实现平衡,而AVL树则通过左右子树的高度差来决定旋转。
  2. 插入效率:红黑树在插入时,由于它只要求部分地达到平衡要求,所以其旋转次数比AVL树要少,因此插入效率更高。
  3. 统计性能:红黑树能够以O(log2n)的时间复杂度进行搜索、插入、删除操作,而AVL树的性能与其应用场景有关,在查找效率上通常较高。

以上区别仅供参考,建议查阅专业书籍或者咨询专业人士了解更多信息。

五、红黑树的优缺点

红黑树的优点主要包括:

  1. 查找、插入和删除操作的平均和最坏情况时间复杂度都是 O(log n),这使得红黑树在大型数据集上的性能非常好。
  2. 红黑树的平衡性使得它对于一些动态插入、删除元素的应用场景非常适合。
  3. 红黑树在应用中非常广泛,常被用于各种高性能的数据结构库,例如 STL 中的 set 和 map。

红黑树的缺点主要包括:

  1. 相比于其他数据结构,红黑树的实现比较复杂,需要维护节点的颜色和平衡。
  2. 在进行大量插入和删除操作的情况下,可能会造成频繁的树重构,影响性能。
  3. 红黑树的实现需要额外的空间来存储颜色信息,这意味着相对于其他数据结构,红黑树的空间占用率可能会更高。

总的来说,红黑树是一种高效、自平衡的数据结构,特别适合在需要频繁进行动态插入和删除操作的场景中使用,例如实现高性能的集合和映射。但是在一些空间受限的场景中,可能会有更好的选择。

六、举个例子

以下是一个红黑树的例子:

假设我们有一个红黑树,其中包含了整数1到11,按照从小到大的顺序插入。在插入过程中,我们需要遵守红黑树的定义和性质,通过旋转和重新着色来保持树的平衡。

插入数字1时,因为树为空,所以直接创建一个黑色的根节点1。

接着插入数字2,因为2比1大,所以将2作为1的右子节点,并将其颜色设置为红色。此时树仍然满足红黑树的定义。

然后插入数字3,因为3比2大,所以将3作为2的右子节点,并将其颜色设置为红色。此时,节点2和节点3都是红色,违反了红黑树的定义。为了解决这个问题,我们需要进行旋转和重新着色操作,将节点2变为黑色,节点1变为红色,然后对节点1进行右旋操作。此时树重新恢复平衡。

接下来继续插入数字4到11,每次插入时都根据红黑树的定义进行相应的调整,包括旋转和重新着色操作。最终得到的红黑树就是一个平衡的二叉查找树,其中包含了数字1到11。

这个例子展示了红黑树在插入过程中的自平衡特性,通过旋转和重新着色操作来保持树的平衡性。这种平衡性确保了红黑树在查找、插入和删除操作上的高效性能。

七、红黑树为什么可以保持平衡

红黑树之所以可以保持平衡,是因为它遵守了红黑树的定义和性质。

首先,红黑树是一种平衡的二叉查找树,它的每个节点要么是红色,要么是黑色。在插入和删除操作中,红黑树通过旋转和染色来保持平衡。

其次,红黑树的核心操作是旋转和染色。旋转操作分为左旋和右旋,它们可以帮助恢复树的平衡性。染色操作则是通过改变节点的颜色来保持红黑树的性质。

在插入操作中,如果插入后的树不再满足红黑树的定义,就需要进行旋转和染色操作来恢复平衡。同样地,在删除操作中,如果删除后的树不再满足红黑树的定义,也需要进行旋转和染色操作来恢复平衡。

最后,红黑树的平衡性是通过颜色和旋转来实现的。每个节点都带有颜色属性,并且每个红色节点都必须有两个黑色的子节点(或空子节点)。这种平衡性保证了从根节点到每个叶节点的所有路径都包含相同数目的黑色节点,从而确保了查找、插入和删除操作的效率。

综上所述,红黑树通过遵守红黑树的定义和性质,通过旋转和染色操作来保持平衡,从而实现了高效的查找、插入和删除操作。

八、红黑树的实现原理是什么

红黑树的实现原理是基于二叉查找树,并通过引入额外的颜色和旋转操作来保持树的平衡。

首先,红黑树是一种自平衡的二叉查找树,它满足二叉查找树的性质,即对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,右子树中的所有节点的值都大于该节点的值。

为了保持平衡,红黑树引入了节点颜色的概念,每个节点都有一个颜色属性,可以是红色或黑色。同时,红黑树还满足以下性质:

  1. 节点是红色或黑色。
  2. 根节点是黑色。
  3. 每个叶节点(NIL节点,空节点)是黑色。
  4. 如果一个节点是红色的,则它的两个子节点都是黑色。
  5. 从任一节点到其每个叶节点的所有路径都包含相同数目的黑色节点。

在插入操作中,当插入一个新的节点时,红黑树会按照二叉查找树的规则进行插入,并将新插入的节点颜色设置为红色。然后,根据红黑树的性质进行调整,包括旋转和重新着色操作,以确保树仍然满足红黑树的定义。

在删除操作中,红黑树会先按照二叉查找树的规则进行删除,然后进行相应的调整来恢复平衡。这可能包括旋转和重新着色操作。

通过遵守这些规则和性质,红黑树能够在插入和删除操作时保持平衡,从而实现高效的查找、插入和删除操作。这种平衡性确保了红黑树在大型数据集上的性能非常好,使其成为许多数据结构库中的首选数据结构之一。

九、一个红黑树C语言用例

#include <stdio.h>  
#include <stdlib.h>  // 定义红黑树节点结构体  
typedef struct node {  int data;           // 节点存储的数据  int color;          // 节点颜色,0表示黑色,1表示红色  struct node *left;  // 左子节点  struct node *right; // 右子节点  
} Node;  // 创建新节点  
Node* create_node(int data) {  Node *new_node = (Node*)malloc(sizeof(Node));  new_node->data = data;  new_node->color = 0; // 初始化为黑色  new_node->left = NULL;  new_node->right = NULL;  return new_node;  
}  // 插入新节点  
Node* insert(Node *root, int data) {  if (root == NULL) {  return create_node(data); // 如果树为空,创建新节点作为根节点  }  if (data < root->data) {  root->left = insert(root->left, data); // 在左子树中插入新节点  } else if (data > root->data) {  root->right = insert(root->right, data); // 在右子树中插入新节点  } else { // 如果要插入的数据已经存在,返回NULL  return NULL;  }  // 如果插入后违反了红黑树的性质,需要进行调整  if (is_red(root->right)) { // 如果右子节点是红色,需要进行左旋操作  root = rotate_left(root);  }  if (is_red(root->left) && !is_red(root->right)) { // 如果左子节点是红色,右子节点是黑色,需要进行右旋操作  root = rotate_right(root);  }  if (is_red(root->left) && is_red(root->right)) { // 如果左右子节点都是红色,需要进行染色操作  flip_colors(root);  }  return root; // 返回根节点指针,用于后续操作  
}  // 判断当前节点是否为红色  
int is_red(Node *node) {  if (node == NULL) { // 如果节点为空,返回0(黑色)  return 0;  } else { // 如果节点不为空,判断颜色是否为红色  return node->color == 1;  }  
}  // 进行左旋操作,将当前节点旋转到左边,返回新的根节点指针  
Node* rotate_left(Node *z) {  Node *y = z->right; // 保存右子节点指针,用于后续操作  z->right = y->left; // 将右子节点的左子节点设为当前节点的右子节点(作为旋转后新的左子节点)  y->left = z; // 将当前节点设为旋转后右子节点的左子节点(作为旋转后新的右子节点)  z->color = y->color; // 将当前节点的颜色设为旋转后右子节点的颜色(用于后续染色操作)  y->color = 1 - z->color; // 将旋转后右子节点的颜色设为当前节点的颜色(用于后续染色操作)  return y; // 返回新的根节点指针(旋转后的根节点)  
}

十、红黑树的插入操作和删除操作的时间复杂度是多少

插入一个节点的时间复杂度是O(log n),因为红黑树是一种平衡二叉查找树,它可以在O(log n)时间内做查找、插入和删除,这里的n是树中元素的数目。在插入过程中,如果插入的节点不是根节点,那么它会根据红黑树的性质进行旋转和染色操作,以保证树的平衡性。这些操作的时间复杂度都是O(log n)。因此,插入一个节点的时间复杂度也是O(log n)。

十一、红黑树和其他BTS树的区别是什么

红黑树和B树在多个方面存在差异。

  1. 平衡性:红黑树是一种自平衡二叉查找树,通过旋转和染色操作保持树的平衡性,从而确保高效的查找、插入和删除操作。而B树是一种多路搜索树,它的平衡性没有红黑树严格,但具有更强的鲁棒性。
  2. 节点颜色:红黑树的节点具有颜色属性,红色和黑色两种。而B树的节点没有颜色属性。
  3. 查找效率:由于红黑树的平衡性更好,其查找效率通常比B树更高。在红黑树中,查找的时间复杂度为O(log n),而在B树中,查找的时间复杂度为O(log n + k),其中k为关键字数量。
  4. 应用场景:红黑树常用于实现关联数组、动态集合和查找表等数据结构。而B树则更常用于数据库和文件系统中,因为B树的节点可以包含多个关键字和子节点,能够更有效地利用磁盘等外部存储设备的特性。

综上所述,红黑树和B树在平衡性、节点颜色、查找效率和应用场景等方面存在差异。

十二、哪种树更适合于数据索引

红黑树和B树都可以用于数据索引,但它们适用于不同的场景。

红黑树是一种自平衡的二叉查找树,它可以确保查找、插入和删除操作的效率。由于红黑树的平衡性较好,它在处理需要频繁进行查找和更新操作的数据集时表现较好。例如,关联数组、动态集合和查找表等数据结构通常使用红黑树来实现。

B树是一种多路搜索树,它适用于磁盘或其他辅助存储设备上的索引和文件系统。B树的节点可以包含多个关键字和子节点,这使得它更适合于处理大型数据集,特别是在磁盘读写操作方面具有较高的效率。因此,B树在数据库和文件系统中被广泛使用。

总的来说,如果需要频繁进行查找和更新操作,且数据集较小,可以使用红黑树作为索引。如果需要处理大型数据集,特别是在磁盘读写方面具有较高效率的场景下,可以使用B树作为索引。

十三、那在实际应用中,哪一种更适合

在实际应用中,选择红黑树还是B树作为索引取决于具体的应用场景和需求。

如果需要频繁进行查找和更新操作,且数据集较小,红黑树是一种很好的选择。它具有较好的平衡性和查找效率,可以快速定位目标数据,并且适用于需要关联数组、动态集合和查找表等数据结构的情况。

如果需要处理大型数据集,特别是在磁盘读写操作方面具有较高效率的场景下,B树是更好的选择。B树的节点可以包含多个关键字和子节点,使得它更适合于处理大型数据集,并且适用于数据库和文件系统等需要高效磁盘访问的应用。

总之,需要根据具体的应用场景和需求来选择合适的索引结构。在某些情况下,红黑树可能更适合,而在其他情况下,B树可能更为合适。

十四、一个红黑树C语言应用

创建一个红黑树涉及到多个概念和函数实现累积起来比较复杂,至关重要的是实现树节点插入、删除、旋转和重新着色的操作。下面为您简要介绍如何用C语言创建一个基本的红黑树,并展示其中的一些核心功能。此红黑树的实现仅用于学习目的,没有经过充分测试和优化。

下面是一个简单的C语言红黑树实现的框架:

#include <stdio.h>
#include <stdlib.h>typedef enum { RED, BLACK } Color;typedef struct Node {int data;Color color;struct Node *left, *right, *parent;
} Node;typedef struct RBTree {Node *root;
} RBTree;Node* createNode(int data) {Node *newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->color = RED;newNode->left = NULL;newNode->right = NULL;newNode->parent = NULL;return newNode;
}RBTree* createRBTree() {RBTree *tree = (RBTree*)malloc(sizeof(RBTree));tree->root = NULL;return tree;
}// 以下是红黑树操作的伪代码占位
void leftRotate(RBTree *tree, Node *x) {// 执行左旋转操作
}void rightRotate(RBTree *tree, Node *y) {// 执行右旋转操作
}void fixViolation(RBTree *tree, Node *newNode) {// 修复红黑树属性的操作
}void insert(RBTree *tree, int data) {Node *newNode = createNode(data);// 执行常规的BST插入操作// 判断并修复任何可能违反红黑树性质的操作fixViolation(tree, newNode);
}// 主函数,用于测试红黑树
int main() {RBTree* tree = createRBTree();insert(tree, 10);insert(tree, 20);insert(tree, 30);// ...添加更多节点// 执行其他操作,比如删除、查找等// 记得释放红黑树所使用的内存// destroyRBTree(tree);return 0;
}

上面的代码展示了一个非常简略的红黑树创建和插入基础的框架。`leftRotate` 和 rightRotate 函数用于调整树结构以维持红黑树特性。`fixViolation` 函数则用于检查并修正可能出现的违反红黑树性质的情况。

要实现一个完整和健壮的红黑树,你需要补完上述示例中缺失的部分,特别是以下几个重要的部分:

1. 实现 leftRotate 和 rightRotate 函数来执行旋转操作。
2. 函数 fixViolation 中实现修复红黑树属性的具体逻辑(处理双红色违规的四种情况:外侧插入、内侧插入、双侧红色和根节点)。
3. 实现搜索、删除节点以及对应的修复函数。

4. 实现内存释放的函数来避免内存泄漏。

注意,这只是一个框架示例代码,真正实现红黑树涉及到许多细节,包括对多种边界条件的处理,以确保树始终维持平衡。因此,如果你需要一个完整的红黑树实现,可以考虑查找完整的图书或者在线资源,或者直接使用现成的库。 

十五、相关链接

【数据结构】史上最好理解的红黑树讲解,让你彻底搞懂红黑树-CSDN博客

菜鸟nginx源码剖析数据结构篇(四)红黑树ngx_rbtree_t-CSDN博客

漫画算法:什么是红黑树?(适合初学红黑树小白简单易懂)_红白树 举例-CSDN博客

C语言-B树(B-树)的完整实现_b-树 c 实现-CSDN博客

rbtree 红黑树的 C 语言实现-CSDN博客

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

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

相关文章

Educational Codeforces Round 160 (Rated for Div. 2)

Educational Codeforces Round 160 (Rated for Div. 2) Educational Codeforces Round 160 (Rated for Div. 2) A. Rating Increase 题意&#xff1a;给定一个由数字字符组成的字符串&#xff0c;且无前导零&#xff0c;将其分割成ab两部分&#xff0c;b不能有前导零&#x…

DETR 【目标检测里程碑的任务】

paper with code - DETR 标题 End-to-End Object Detection with Transformers end-to-end 意味着去掉了NMS的操作&#xff08;生成很多的预测框&#xff0c;nms 去掉冗余的预测框&#xff09;。因为有了NMS &#xff0c;所以调参&#xff0c;训练都会多了一道工序&#xff0c…

Gemini 1.0:Google推出的全新AI模型,改变生成式人工智能领域的游戏规则!

Gemini 1.0&#xff1a;Google推出的全新AI模型&#xff0c;将改变生成式人工智能领域的游戏规则&#xff01; &#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; IT杂谈 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 …

Ubuntu18.04 上通过 jihu 镜像完成 ESP-IDF 编译环境搭建流程

为了解决国内开发者从 github 克隆 esp 相关仓库慢的问题&#xff0c;已将 esp-idf 和部分重要仓库及其关联的子模块镜像到了 jihu&#xff0c;这些仓库将自动从原始仓库进行同步。此篇博客用来阐述 Ubuntu18.04 上通过 jihu 镜像完成 ESP-IDF 编译环境搭建流程。 注&#xff1…

LeetCode Hot100 51.N皇后

题目&#xff1a; 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的…

亚马逊鲲鹏系统:引领批量自动操作买家号先进技术

亚马逊&#xff0c;作为全球最大的电商平台之一&#xff0c;其独特的自动化批量操作一直是众多我追逐的焦点。深入了解其主要使用方法&#xff0c;通过批量导入无数个买家账户&#xff0c;借助最新的反指纹技术和国外代理IP的绑定&#xff0c;可以成功规遍亚马逊市场&#xff0…

TortoiseGit通过SSH连接配置,生成SSH密钥方法

生成SSH密钥&#xff1a; Win环境下命令(git ssh key是可以自定义命名的)&#xff1a; ssh-keygen -t ed25519 -C "git ssh key" && start "" "C:\Windows\notepad.exe" "C:\Users\%username%\.ssh\id_ed25519.pub" 打开cm…

三相异步电机动态数学模型推导及矢量控制仿真

文章目录 **原文链接&#xff0c;点击跳转**三相异步电机动态数学模型及矢量控制仿真1、异步电机三相方程2、坐标变换3、磁链3/2变换推导4、两相静止坐标系下的方程5、两相旋转坐标系下的方程6、以 ω-is-Ψr 为状态变量的状态方程7、矢量控制及 matlab 仿真 原文链接&#xff…

Linux中使用HTTP协议进行API交互的示例

在Linux中&#xff0c;HTTP协议就像一个神奇的传送门&#xff0c;让我们可以通过网络进行各种交互。这不&#xff0c;今天我们就来探讨一下如何使用HTTP协议在Linux中进行API交互。 首先&#xff0c;我们需要一个API。为了方便演示&#xff0c;我们假设有一个天气预报API&…

spark介绍及简单使用

简介 Spark是由加州大学伯克利分校AMPLab&#xff08;AMP实验室&#xff09;开发的开源大数据处理框架。起初&#xff0c;Hadoop MapReduce是大数据处理的主流框架&#xff0c;但其存在一些限制&#xff0c;如不适合迭代算法、高延迟等。为了解决这些问题&#xff0c;Spark在20…

Re解析(正则表达式解析)

正则表达式基础 元字符 B站教学视频&#xff1a; 正则表达式元字符基本使用 量词 贪婪匹配和惰性匹配 惰性匹配如下两张图&#xff0c;而 .* 就表示贪婪匹配&#xff0c;即尽可能多的匹配到符合的字符串&#xff0c;如果使用贪婪匹配&#xff0c;那么结果就是图中的情况三 p…

【Unity】运行时创建曲线(贝塞尔的运用)

[Unity]运行时创建线&#xff08;贝塞尔的运用&#xff09; 1. 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线。 2. 原理介绍 2.1 曲线的创建 unity建立网格曲线可以参考Unity程序化网格体的实现方法。主要分为顶点&#xff0c;三角面&#xff0c…

浪潮信息KOS服务器操作系统:经过周密考虑后的智慧之选

文章目录 一、引言二、服务器操作系统概述三、选择服务器操作系统的关键因素四、评估服务器操作系统的标准五、选择服务器操作系统的实践经验六、浪潮信息KOS服务器操作系统一、稳定可靠二、高效协同三、全天候运维四、广泛兼容 七、总结与展望 浪潮信息信息KOS是浪潮信息信息基…

linux: ip route 与 route 用法详解与对比

文章目录 1. 引言2. ip route2.1 描述2.2 语法2.3 参数2.4 例子 3. route3.1 描述3.2 语法3.3 参数3.4 例子 4. 对比5. 参考 1. 引言 本文主要介绍 ip route 以及 route 的用法和区别。 2. ip route 2.1 描述 用于管理静态路由表。linux 系统中&#xff0c;可以自定义从 1&…

【docker】数据管理

Docker容器会随时关闭和开启,Docker 容器的数据放哪里呢&#xff1f; 答案就是&#xff1a;数据卷和数据卷容器 官网文档 Manage data in Docker | Docker Docs 数据卷(Data Volume) 数据卷就是将宿主机的某个目录&#xff0c;映射到容器中&#xff0c;作为数据存储的目录&…

无框架Java转go语言写http与tcp请求

项目地址 https://github.com/cmdch2017/http_tcpServer 项目结构 如何快速上手 http篇 1、controller包就相当于RestController&#xff0c;这里返回了一个Person对象&#xff0c;当你需要新建一个接口时&#xff0c;再新写一个func仿照下面的方法就行了 package control…

CSS设计器的使用

目录 css的概念 css的优势 css的基本语法 html中引入css样式 CSS基本选择器 选择器的使用 初级选择器&#xff1a; 标签选择器 类选择器 id选择器 高级选择器(结构选择器&#xff09; ①后代选择器(E F) ②子选择器(E>F) ③相邻兄弟选择器(EF) ④通用兄弟选择器(…

kubernetes-L7负载均衡ingress

一、iptables/ipvs 前面我们说到kube-proxy是基于iptables/ipvs的分布式L4负载均衡技术&#xff0c;但是有很多的需求场景是这种网络层的dnat不能提供的能力。 基于L4的服务 每个应用独占ELB&#xff0c;浪费资源每个服务都需要创建DNS配置启动HTTPS&#xff0c;每个服务需要…

从零开始制作一个Douban图像下载器:Wt库的基础知识和操作指南

引言 欢迎来到本文&#xff0c;如果你希望从豆瓣下载海量的高清图像、学习使用现代C web应用程序框架Wt库开发web应用程序&#xff0c;或者了解如何利用代理IP和多线程技术提高爬虫效率和稳定性&#xff0c;那么你来对地方了。在接下来的内容中&#xff0c;我们将为你提供一个…

Taro旧项目埋坑日记

Taro旧项目埋坑日记 unexpected "\" at pos 148