数据结构05:树与二叉树 习题01[C++]

   

考研笔记整理,本篇作为树与二叉树的基本概念习题,供小伙伴们参考~🥝🥝

之前的博文链接在此:数据结构05:树与二叉树[C++]-CSDN博客~🥝🥝

  • 第1版:王道书的课后习题~🧩🧩

编辑:梅头脑🌸

参考用书:王道考研《2025年 数据结构考研复习指导》


目录

🧵01 三叉树最小高度

🧵02 节点与度(一)

🧵03 节点与度(二)

🧵04 二叉树节点与度

🧵05 满二叉树节点数

🧵06 完全二叉树节点数

🧵07 满二叉树节点与编号

🧵08 顺序存储二叉树的公共祖先

🧵09 k二叉树节点

🔚结语


🧵01 三叉树最小高度

🧩题目

含有n个结点的三叉树的最小高度是多少?

📇解题思路

 高度为1的三叉树有1个结点,等比数列求和公式为:1 = 1x(3^1-1)/(3-1) = 1
 高度为2的三叉树有4个结点,等比数列求和公式为:1+3 = 1x(3^2-1)/(3-1) = 4
 高度为3的三叉树有13个结点,等比数列求和公式为:1+3+9 = 1x(3^3-1)/(3-1) = 13
 ...
 高度为n的三叉树有1+3+9+...+3^(n-1)个结点,等比数列求和公式为:n = 1+3+9+...+3^(h-1) = 1x(3^h-1)/(3-1) = (3^h-1)/2
 移项:3^h = 2*n + 1,取对数:h = log3(2*n + 1),向上取整,即为最小高度。


🧵02 节点与度(一)

🧩题目

已知一棵度为4的树中,度为0,1,2,3 的结点数分别为14,4,3,2个,求该树的节点总数n和度为4的结点个数,并给出推导过程。

📇解题思路

 节点数 = 分支数 + 1,因为没有指向根节点的分支;
 节点数 = 14 + 4 + 3 + 2  = 23;
 度为1、2、3的分支数 = 14*0 + 4*1 + 3*2 + 2*3 = 4 + 6 + 6 = 16;
 度为4的分支数 = 总分支数 - 度为1、2、3的分支数 = 23 - 16 = 7;
 度为4的结点数 = (度为4的分支数 + 1) / 4 = (7 + 1) / 4 = 2;
 节点总数 = 度为1、2、3的结点数 + 度为4的结点数 = 14 + 4 + 3 + 2 + 2 = 25;


🧵03 节点与度(二)

🧩题目

已知一棵度为m的树中,有n1个度为1的节点,有n2个度为2的节点……有nm个度为m的节点,问该树有多少叶节点?

📇解题思路

节点数 = 分支数 + 1,因为没有指向根节点的分支;
节点数 = n0 + n1 + n2 + n3 + …… + nm;
分支数 = n0*0 + n1*1 + n2*2 + n3*3 + …… + nm*m;
代入等式,n0 + n1 + n2 + n3 + …… + nm = n0*0 + n1*1 + n2*2 + n3*3 + …… + nm*m + 1;
n0节点总数 = n1*(1-0) + n2*(2-1) + n3*(3-1) + …… + nm*(m-1) + 1 ;


🧵04 二叉树节点与度

🧩题目

 在一棵完全二叉树中, 含有n0个叶结点, 当度为1的结点数为1时, 该树的高度是多少 ? 当度为1的结点数为0时,该树的高度是多少 ?

📇解题思路

 二叉树的节点数n = n0 + n1 + n2,其中n0为叶子节点数,n1为度为1的节点数,n2为度为2的节点数;
 二叉树的节点数n = 分支数 + 1 = n1 + 2 * n2 + 1;
 联立以上两个等式,得到n0 = n2 + 1;
 又因为完全二叉树的高度h = log2(n + 1),向上取整; 
 当度为1的结点数为1时,n = n0 + 1 +  n0 - 1 = 2 * n0,所以 h = log2[2 * n0 + 1],向上取整;
 当度为1的结点数为0时,n = n0 + n0 - 1 = 2 * n0 - 1,所以 h = log2[2 * n0],向上取整;


🧵05 满二叉树节点数

🧩题目

 一棵有n个结点的满二叉树有多少个分支结点和多少个叶结点?该满二叉树的高度是多少?

📇解题思路

 二叉树的节点数n = n0 + n1 + n2,其中n0为叶子节点数,n1为度为1的节点数,n2为度为2的节点数;
 满二叉树不存在n1。又因为二叉树满足 n0 = n2 + 1;
 所以,满二叉树的节点数n = 2 * n0 - 1 = 2 * n2 + 1; 节点 n0 = (n + 1) / 2, 节点 n2 = (n - 1) / 2;
 满二叉树的节点n = 2^h - 1,高度h = log2(n + 1)。


🧵06 完全二叉树节点数

🧩题目

 已知完全二叉树的第9层有 240个结点,则整个完全二叉树有多少个结点 ? 有多少个叶结点 ?

📇解题思路

 完全二叉树的第n层最多有 2^(n-1) 个结点,第9层最多有 2^8 = 256 个结点;因此,考虑到完全二叉树的性质,240个节点均为叶结点;
 但叶结点并非仅有第9层才有,第8层也有叶结点,第8层最多有 2^7 = 128 个结点,被第9层用掉 240 / 2 = 120个叶结点,还剩 8 个叶结点;整棵树共计248个叶结点,没有 n1 节点;
 完全二叉树的结点数 n = n0 + n1 + n2 = n0 + (n0 - 1) = 2 * (240 + 8) - 1 = 495 个结点;


🧵07 满二叉树节点与编号

🧩题目

一棵高度为h的满 m又树有如下性质 : 根结点所在层次为第1层,第h层上的结点都是叶结点,其余各层上每个结点都有m棵非空子树,若按层次自顶向下,同一层自左向右
顺序从1开始对全部结点进行编号,试问 :
1)各层的结点个数是多少 ?
2)编号为i的结点的双亲结点(若存在)的编号是多少 ?
3)编号为i的结点的第k个孩子结点(若存在)的编号是多少 ?
4)编号为i的结点有右兄弟的条件是什么 ? 其右兄弟结点的编号是多少 ?

📇解题思路

 1)等比数列,第i层的结点个数是 m^(i-1);
 3)在三叉树中,节点2、3、4的双亲节点为1,节点5、6、7的双亲节点为2,即孩子节点 = (双亲节点i - 1) * 3 + 1 + k;同理,在m叉树中,第2、3、...m + 1的双亲节点为1,节点m + 2、m + 3、...2m + 1的双亲节点为2,即孩子节点 = (双亲节点i - 1) * m + 1 + k;
 2)根据3)题,第1个孩子节点 = (双亲节点i - 1) * m + 2;因此,编号为i的结点的双亲结点的编号是 ((i - 2) / m) + 1,向下取整;
 4)根据3)题,最后1个孩子节点i = (双亲节点 - 1) * m + 1;因此,编号为i的结点有右兄弟的条件是 (i - 1) % m != 0,其右兄弟结点的编号是 i + 1;


🧵08 顺序存储二叉树的公共祖先

🧩题目

已知一棵二叉树按顺序存储结构进行存储,设计一个算法,求编号分别为i和j的两个结点的最近的公共祖先结点的值。

📇友情配图

我们以下的代码以这棵树为例,为了方便求祖先,这里将数组编号与内容对应一致~

以下解法的核心思路都是建立在:

  • 父节点序号 = (子节点序号 - 1)/ 2 的基础上,注意计算机运算会自动向下取整;
  • 假设树中节点没有负值,返回-1表示该节点不存在。

📇解题思路1:使用2个栈完成遍历

使用两个栈,分别存储节点 1 和 2 的祖先。

然后从两个栈的起点开始同时遍历,如果节点相同,表明该节点是二者公共祖先;否则,该节点不满足题目要求,停止循环。

这个解题代码的空间复杂度和时间复杂度都很高,完全不推荐

⌨️解题代码

#include <iostream>
#include <vector>
#include <stack>
using namespace std;

// 二叉树的顺序存储结构
typedef struct {
	vector<int> tree;
} SqBiTree;

int find_common_ancestor(SqBiTree T, int i, int j) {
	if (i < 0 || i >= T.tree.size() || j == -1 || j >= T.tree.size()) { 
        return -1; 
    }

	// 根据节点下标,确认祖先节点的位置,并将祖先全部入栈
	int index1 = i;
	int index2 = j;
	stack<int> ancestor1;
	stack<int> ancestor2;
	do {
		ancestor1.push(T.tree[index1]);
		if (index1 > 1) { index1 = (index1 - 1) / 2; }
		else { index1 = index1 - 1; }
	} while (index1 >= 0);
	do {
		ancestor2.push(T.tree[index2]);
		if (index2 > 1) index2 = (index2 - 1) / 2;
		else { index2 = index2 - 1; }
	} while (index2 >= 0);

	// 从栈顶开始遍历,如果节点相同,继续往下遍历;如果节点不同,退出循环
	int common_ancestor = -1;
	while (!ancestor1.empty() && !ancestor2.empty()) {
		if (ancestor1.top() != ancestor2.top()) { break; }
		common_ancestor = ancestor1.top();
		ancestor1.pop();
		ancestor2.pop();
	}

	return common_ancestor;
}


int main() {
	SqBiTree T = { {0, 1, 2, 3, 4, 5, 6, 7, 8} };

	int node1 = -1, node2 = -1, result = -1;

	node1 = 7, node2 = 8;
	result = find_common_ancestor(T, node1, node2);
	cout << "节点 " << node1 << " 与 " << node2 << " 的公共祖先是节点 " << result << endl;

	node1 = 5, node2 = 2;
	result = find_common_ancestor(T, node1, node2);
	cout << "节点 " << node1 << " 与 " << node2 << " 的公共祖先是节点 " << result << endl;

	node1 = 3, node2 = 6;
	result = find_common_ancestor(T, node1, node2);
	cout << "节点 " << node1 << " 与 " << node2 << " 的公共祖先是节点 " << result << endl;

	node1 = 9, node2 = 3;
	result = find_common_ancestor(T, node1, node2);
	cout << "节点 " << node1 << " 与 " << node2 << " 的公共祖先是节点 " << result << endl;

	return 0;
}

⌨️跑题代码

以下这个代码跑题了,传入的参数是节点值,而非节点编号,😣——

#include <iostream>
#include <vector>
#include <stack>
using namespace std;

// 二叉树的顺序存储结构
typedef struct {
	vector<int> tree;
} SqBiTree;

int find_common_ancestor(SqBiTree T, int node1, int node2) {
	// 从数组中找到 node1, node2的下标
	int locate1 = -1;
	int locate2 = -1;
	for(int i = 0; i < T.tree.size(); i++){
		if (T.tree[i] == node1) { locate1 = i; }
		if (T.tree[i] == node2) { locate2 = i; }
	}
	if (locate1 == -1 || locate2 == -1) { return -1; }

	// 根据节点下标,确认祖先节点的位置,并将祖先全部入栈
	int index1 = locate1;
	int index2 = locate2;
	stack<int> ancestor1;
	stack<int> ancestor2;
	do {
		ancestor1.push(T.tree[index1]);
		if (index1 > 1) { index1 = (index1 - 1) / 2; }
		else {index1 = index1 - 1;}
	} while (index1 >= 0);
	do {
		ancestor2.push(T.tree[index2]);
		if (index2 > 1) index2 = (index2 - 1) / 2;
		else { index2 = index2 - 1; }
	} while (index2 >= 0);

	// 从栈顶开始遍历,如果节点相同,继续往下遍历;如果节点不同,退出循环
	int common_ancestor = -1;
	while (!ancestor1.empty() && !ancestor2.empty()) {
		if (ancestor1.top() != ancestor2.top()) { break; }
		common_ancestor = ancestor1.top();
		ancestor1.pop();
		ancestor2.pop();
	}

	return common_ancestor;
}


int main() {
	SqBiTree T = { {0, 1, 2, 3, 4, 5, 6, 7, 8} };

	int node1 = -1, node2 = -1, result = -1;

	node1 = 7, node2 = 8;
	result = find_common_ancestor(T, node1, node2);
	cout << "节点 " << node1 << " 与 " << node2 << " 的公共祖先是节点 " << result << endl;

	node1 = 5, node2 = 2;
	result = find_common_ancestor(T, node1, node2);
	cout << "节点 " << node1 << " 与 " << node2 << " 的公共祖先是节点 " << result << endl;

	node1 = 3, node2 = 6;
	result = find_common_ancestor(T, node1, node2);
	cout << "节点 " << node1 << " 与 " << node2 << " 的公共祖先是节点 " << result << endl;

	node1 = 9, node2 = 3;
	result = find_common_ancestor(T, node1, node2);
	cout << "节点 " << node1 << " 与 " << node2 << " 的公共祖先是节点 " << result << endl;

	return 0;
}

📇解题思路2:使用2个循环完成遍历

从2个节点的位置开始向祖先遍历,每次循环时,较远的节点找到其祖先,然后判断2个节点的祖先此时是否相等~

相比上一个代码,代码的数量、遍历的次数和使用的空间都减少了很多~

 ⌨️解题代码

#include <iostream>
#include <vector>
#include <stack>
using namespace std;

// 二叉树的顺序存储结构
typedef struct {
	vector<int> tree;
} SqBiTree;

int find_common_ancestor(SqBiTree T, int i, int j) {
	if (i < 0 || i >= T.tree.size() || j == -1 || j >= T.tree.size()) { 
		return -1; 
	}

	// 根据节点下标,确认祖先节点的位置
	while (i != j) {
		if (i > j)
			i = (i - 1) / 2;
		else
			j = (j - 1) / 2;
	}

	return T.tree[i];
}

int main() {
	SqBiTree T = { {0, 1, 2, 3, 4, 5, 6, 7, 8} };

	int node1 = -1, node2 = -1, result = -1;

	node1 = 7, node2 = 8;
	result = find_common_ancestor(T, node1, node2);
	cout << "节点 " << node1 << " 与 " << node2 << " 的公共祖先是节点 " << result << endl;

	node1 = 5, node2 = 2;
	result = find_common_ancestor(T, node1, node2);
	cout << "节点 " << node1 << " 与 " << node2 << " 的公共祖先是节点 " << result << endl;

	node1 = 3, node2 = 6;
	result = find_common_ancestor(T, node1, node2);
	cout << "节点 " << node1 << " 与 " << node2 << " 的公共祖先是节点 " << result << endl;

	node1 = 9, node2 = 3;
	result = find_common_ancestor(T, node1, node2);
	cout << "节点 " << node1 << " 与 " << node2 << " 的公共祖先是节点 " << result << endl;

	return 0;
}

⌨️跑题代码

和上面的理由一样,以下这个代码跑题了,传入的参数是节点值,而非节点编号,😣——

#include <iostream>
#include <vector>
using namespace std;

// 二叉树的顺序存储结构
typedef struct {
	vector<int> tree;
} SqBiTree;

int find_common_ancestor(SqBiTree T, int node1, int node2) {
	// 从数组中找到 node1, node2的下标
	int locate1 = -1;
	int locate2 = -1;
	for(int i = 0; i < T.tree.size(); i++){
		if (T.tree[i] == node1) { locate1 = i; }
		if (T.tree[i] == node2) { locate2 = i; }
	}
	if (locate1 == -1 || locate2 == -1) { return -1; }

	// 根据节点下标,确认祖先节点的位置
	while (locate1 != locate2) {
		if (locate1 > locate2)
			locate1 = (locate1 - 1) / 2;
		else
			locate2 = (locate2 - 1) / 2;
	}

	return T.tree[locate1];
}


int main() {
	SqBiTree T = { {0, 1, 2, 3, 4, 5, 6, 7, 8} };

	int node1 = -1, node2 = -1, result = -1;

	node1 = 7, node2 = 8;
	result = find_common_ancestor(T, node1, node2);
	cout << "节点 " << node1 << " 与 " << node2 << " 的公共祖先是节点 " << result << endl;

	node1 = 5, node2 = 2;
	result = find_common_ancestor(T, node1, node2);
	cout << "节点 " << node1 << " 与 " << node2 << " 的公共祖先是节点 " << result << endl;

	node1 = 3, node2 = 6;
	result = find_common_ancestor(T, node1, node2);
	cout << "节点 " << node1 << " 与 " << node2 << " 的公共祖先是节点 " << result << endl;

	node1 = 9, node2 = 3;
	result = find_common_ancestor(T, node1, node2);
	cout << "节点 " << node1 << " 与 " << node2 << " 的公共祖先是节点 " << result << endl;

	return 0;
}


🧵09 k二叉树节点

🧩题目

【2016统考真题】若一棵非空k(k >= 2)又树T中的每个非叶结点都有k个孩子,则称I为正则k叉树。请回答下列问题并给出推导过程。
1)若T有m个非叶结点,则T中的叶结点有多少个 ?
2)若T的高度为h(单结点的树h = 1),则T的结点数最多为多少个 ? 最少为多少个 ?

📇解题思路

1) 最少是除了根节点层与底层外,每层有1个节点有k个孩子,其它 k-1 个节点是叶结点:n = m + n0 = 1 + k * m, n0 = (k - 1)*m + 1;
2) 最多是满二叉树:1 + k + k^2 + ... = (k^(h - 1) - 1)(k - 1); 最少是1 + k + k + ... = k * (h - 1) + 1;


🔚结语

博文到此结束,写得模糊或者有误之处,欢迎小伙伴留言讨论与批评,督促博主优化内容{例如有错误、难理解、不简洁、缺功能}等,博主会顶锅前来修改~😶‍🌫️

我是梅头脑,本片博文若有帮助,欢迎小伙伴动动可爱的小手默默给个赞支持一下,收到点赞的话,博主肝文的动力++~🌟🌟

同系列的博文:🌸数据结构_梅头脑_的博客-CSDN博客

同博主的博文:🌸随笔03 笔记整理-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有什么方便实用的黏土特效教程?6个软件教你快速进行特效制作

有什么方便实用的黏土特效教程&#xff1f;6个软件教你快速进行特效制作 作为时尚小达人&#xff0c;你自己是否想要制作出属于自己的黏土特效照片呢&#xff1f;比如下面几种。 看到这些黏土特效软件有没有心动&#xff0c;下面我也为大家详细的介绍一下可以制作出对应特效的…

金石传拓非遗研学基地 入驻蔚蓝书店

好消息&#xff01;&#xff01;&#xff01; 金石传拓非遗研学基地&#xff0c;正式入驻蔚蓝书店啦&#xff01;&#xff01;&#xff01; “缣竹易销&#xff0c;金石难灭&#xff0c;托以高山&#xff0c;永留不绝。”“金”指的是三代青铜器上的铭文。 “石”指的是石刻、…

视频号小店应该如何开店呢?详细的开店流程分享给你!

大家好&#xff0c;我是电商小V 视频号小店就是威信视频号团队为咱们商家提供的卖货平台&#xff0c;可以说是支持咱们商家在视频号场景中开店进行经营的模式&#xff0c; 视频号大概的开店流程那就是&#xff1a;找到视频号开店&#xff0c;选择企业入驻&#xff0c;填写信息&…

win7安装camera raw13.0.2详解。

首先win7是不能直接安装camera raw13.0.2的。所以我安装的是camera raw12版本。 然后就是重点了&#xff0c;打开文件C:\Program Files\Common Files\Adobe\Plug-Ins\CC\File Formats&#xff0c; 复制下载的camera raw13.0.2的8bi文件。 替换 这样就能在window7中使用了。网…

LinkedList链表

LinkedList 的全面说明 LinkList底层实现了双向链表和双端队列特点可以添加任意元素&#xff08;元素可以重复&#xff09;&#xff0c;包括null线程不安全&#xff0c;没有实现同步 LinkedList 的底层操作机制 LinkedList底层维护了一个双向链表LinkList中维护了两个属性fi…

学习javascript,实现一个简易售卖机的功能

有同学提问&#xff0c;说想实现一个JS售卖机的功能&#xff0c;我觉得这个挺有意思的&#xff0c;正是初学者学习JS&#xff0c;锻炼软件开发思维的一个好题目&#xff0c;所以就实现了一下&#xff0c;希望可以有帮助。 目录 1 需求分析 2 开发实现 2.1 商家端录入 2.2…

Linux中的fork与进程地址空间

目录 前言 一、进程地址空间 二、fork的值返回 三、高清图链接 总结 前言 在博主的《进程状态解析》一文中&#xff0c;在讨论进程创建时&#xff0c;提到了一个系统调用接口fork&#xff0c;它在使用过程中表现出对于父子进程不一致的返回结果&#xff0c;而且似乎还具有…

深入学习指针2

前言 hello,我又来了&#xff0c;今天有我继续带领大家深入的学习指针&#xff0c;通过上次的学习&#xff0c;我们已经了解到了指针的基本概念&#xff0c;指针如何使用&#xff0c;指针使用的益处&#xff0c;以及一些相关的概念&#xff0c;那今天我们就继续深入的学习&am…

Docker笔记(七)使用Docker部署Spring Boot项目

本文介绍如何使用Docker打包并部署Spring Boot多模块项目。 其中本文涉及的Docker的私库是用Nexus3搭建的。 使用Docker部署Spring Boot项目有三种方式 &#xff08;1&#xff09;使用 spring-boot-maven-plugin内置的build-image. &#xff08;2&#xff09;使用 Google 的 j…

STM32CubeMX软件使用(超详细)

1、Cube启动页介绍 2、芯片选择页面介绍 3、输入自己的芯片型号&#xff0c;这里以STM32U575RIT6举例 4、芯片配置页码介绍 5、芯片外设配置栏详细说明 6、点击ClockConfiguration进行时钟树的配置&#xff0c;选择时钟树后可以选择自己想使用的时钟源&#xff0c;也可以直接输…

MySQL数据库——基础事务操作-BEGIN-COMMIT-ROLLBACK

DDL CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT COMMENT 学号,createDate datetime DEFAULT NULL,userName varchar(20) DEFAULT NULL,pwd varchar(36) DEFAULT NULL,phone varchar(11) DEFAULT NULL,age tinyint(3) unsigned DEFAULT NULL,sex char(2) DEFAU…

MySQL企业级开发重点之事物和索引

事物 -- 解散学工部 delete from tb_dept where id 1;-- 删除部门下的员工 delete from tb_emp where dept_id 1; 介绍和操作 我们应该将两个语句写成一个语句 -- 开启事物 start transaction ;-- 解散学工部 delete from tb_dept where id 3;-- 删除部门下的员工 delete fr…

Word页脚设置“第X页共X页”的方法【域实现】

Word页脚设置“第X页共X页”的方法【域实现】 在设置Word页码格式的要求中&#xff0c;有时需要设置为“第X页共X页”这种格式&#xff0c;使用Word中的域功能可实现&#xff0c;同时&#xff0c;在某些情况下&#xff0c;可能还需要减去封面的页码&#xff0c;接下来为具体步…

传感器—超声波雷达

声波技术 在讲述超声波雷达之前&#xff0c;先了解一下声波的概念以及超声波和声波之间的关系 什么是声波&#xff1f; 声波是物体机械振动状态&#xff08;或能量&#xff09;的传播形式。所谓振动是指物质的质点在其平衡位置附近进行的往返运动形式&#xff0c;这种振动状…

JAVA文件的简单操作

文件IO&#xff08;Input和Output&#xff09; 文件的输入和输出是人为规定的&#xff0c;那么什么是输入&#xff1f;什么是输出捏&#xff1f;在这里统一已CPU为基准 例如&#xff1a;将文件由内存写入硬盘就是输出&#xff0c;有硬盘写入内存就是输入。可以总结为&#xff…

C语言—深入理解指针(3)

1.字符指针变量 一般使用&#xff1a; 另一种使用方法&#xff1a; “hello world”是一个常量字符串&#xff0c;不能被修改。 上述代码是将字符串中的首字符‘h’赋值给指针pstr&#xff0c;用%s打印字符串的时候&#xff0c;只需要提供首字符的地址就行。&#xff08;如果…

LoadRunner性能测试基本步骤

前言 本文旨在指导初学者使用LoadRunner进行基础的性能测试。 我们在接到一个性能测试任务的时候&#xff0c;需要从以下几点考虑&#xff1a;我们的测试对象是什么&#xff0c;测试要求是什么&#xff0c;测试环境怎么部署的&#xff0c;业务规模如何&#xff0c;哪些业务点是…

这是一关于DSC相关的文档

这是一关于DSC相关的文档 上面这幅图清晰的展示了somewhat flat的像素图示

CRMEB 开源/标准版商城系统客服配置教程

管理后台/设置/系统设置/商城配置/客服端配置 有系统客服/拨打电话/跳转链接可选&#xff0c;系统客服为系统自带的客服系统&#xff0c;拨打电话为用户点击联系客服为拨打客服电话的方式&#xff0c;跳转链接为可以跳转自己开发的客服系统或者第三方的客服系统或者企业微信的…

etcd单机部署和集群部署

1、etcd单实例部署 对于平常的学习&#xff0c;其实搭建一个单机节点是够了的。接下来就讲讲怎么搭建单机节点。 本次部署是在 centos7 系统&#xff0c;cpu 为amd64 上面进行的。 部署是直接使用官方编译好的二进制文件&#xff0c;大家也可以直接看 ectd-releases 界面选择…
最新文章