当前位置: 首页 > news >正文

基础数据结构--二叉树

一、二叉树的定义

二叉树是 n( n >= 0 ) 个结点组成的有限集合,这个集合要么是空集(当 n 等于 0 时),要么是由一个根结点和两棵互不相交的二叉树组成。其中这两棵互不相交的二叉树被称为根结点的左子树和右子树。

如图所示,2 是 1 的左子树,3 是 1 的右子树;同时,4 和 5 分别是 2 的左右子树,6 和 7 分别是 3 的左右子树。

二、二叉树的特点

二叉树是一种树,它有如下几个特征:

1)每个结点最多二棵子树,即每个结点的孩子结点个数为 0、1、2。

2)这两棵子树是有顺序的,分别叫:左子树 和 右子树,就像左手和右手一样,是不能颠倒的。

3)如果只有一棵子树的情况,也需要区分顺序,如图所示:

b 为 a 的左子树

c 为 a 的右子树

三、特殊二叉树

1、斜树

所有结点都只有左子树的二叉树,被称为左斜树,像这样:

所有结点都只有右子树的二叉树,被称为右斜树,像这样:

斜树有点类似线性表,所以线性表可以理解为一种特殊形式的树。

2、满二叉树

对于一棵二叉树,如果它的所有根结点和内部结点都存在左右子树,且所有叶子结点都在同一层,这样的树就是满二叉树,像这样:

满二叉树有如下几个特点:

1)叶子结点一定在最后一层

2)非叶子结点的度为 2

3)深度相同的二叉树中,满二叉树的结点个数最多,为 2^h-1(其中 h 代表树的深度)

3、完全二叉树

对一棵具有 n 个结点的二叉树,按照层序进行编号,如果编号 i 的结点和同样深度的满二叉树中的编号 i 的结点在二叉树中,位置完全相同则被称为 完全二叉树。

满二叉树一定是完全二叉树,而完全二叉树则不一定是满二叉树,完全二叉树有如下几个特点:

1)叶子结点只能出现在最下面两层

2)最下层的叶子结点,一定是集中在左边的连续位置,倒数第二层如果有叶子结点一定集中在右边的连续位置

3)如果某个结点度为 1,则只有左子树,即 不存在只有右子树 的情况

4)同样结点数的二叉树,完全二叉树的深度最小

如下图所示,就不是一棵完全二叉树,因为 5 号结点没有右子树,但是 6 号结点是有左子树的,不满足上述第 2 点。

四、二叉树的性质

以下性质对理解二叉树有很好的帮助,可以尝试自行证明。或许在后续遇到贪心相关问题时,需要用到这些证明。

1)二叉树的第 i(i >= 1)层上最多 2^(i-1) 个结点;

2)深度为 h 的二叉树至多 2^h - 1 个结点;

3)n 个结点的完全二叉树的深度为 floor(log2n) + 1(其中 floor(x) 代表对 x 取下整);

五、二叉树的顺序存储

二叉树的顺序存储就是指:利用顺序表对二叉树进行存储。结点的存储位置即顺序表的索引,能够体现结点之间的逻辑关系比如父结点和孩子结点之间的关系,左右兄弟结点之间的关系 等等。

1、完全二叉树

来看一棵完全二叉树,我们对它进行如下存储:

编号代表了顺序表索引的绝对位置,映射后如下

这里为了方便,我们把顺序表索引为 0 的位置给留空了。

这样一来,当知道某个结点在顺序表中的索引 x,就可以知道它左右儿子的索引分别为 2x 和 2x+1。反之,当知道某个结点的索引 x,也能知道它父结点的索引为 floor(x/2)。

2、非完全二叉树

对于非完全二叉树,只需要将对应不存在的结点设置为空即可

编号代表了顺序表索引的绝对位置,映射后如下

3、稀疏二叉树

对于较为稀疏的二叉树,就会有如下情况出现。这时候如果用这种方式进行存储,就比较浪费内存了

编号代表了顺序表索引的绝对位置,映射后如下:

下标0123456789101112
data-abcd--gh----

这种情况下,为了提升内存利用率,我们可以采用链表进行存储。

六、二叉树的链式存储

二叉树每个结点至多有两个孩子结点,所以对于每个结点设置一个 数据域(data) 和 两个 指针域(left 和 right) 即可。指针域 分别指向 左孩子结点 和 右孩子结点。

七、二叉树的遍历概念

二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点访问一次且仅被访问一次。

对于线性表的遍历,要么从头到尾,要么从尾到头,遍历方式较为单纯。但是树不一样,它的每个结点都有可能有两个孩子结点,所以遍历的顺序面临着不同的选择。

二叉树的常用遍历方法,有以下四种:前序遍历、中序遍历、后序遍历、层序遍历。

下标0123456789101112
data-abcd-efgh--i

八、二叉树的前序遍历

如果二叉树为空则直接返回,否则先访问根结点,再递归前序遍历左子树,再递归前序遍历右子树。前序遍历的结果如下:abdghcefi

九、二叉树的中序遍历

如果二叉树为空则直接返回,否则先递归中序遍历左子树,再访问根结点,再递归中序遍历右子树。中序遍历的结果如下:gdhbaecif。

十、二叉树的后序遍历

如果二叉树为空则直接返回,否则先递归后遍历左子树,再递归后序遍历右子树,再访问根结点。后序遍历的结果如下:ghdbeifca。

十一、二叉树的层序遍历

如果二叉树为空直接返回,否则依次从树的第一层开始,从上至下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。图中二叉树层序遍历的结果为:abcdefghi。

一、二叉树结点定义

#include <iostream>using namespace std;template < typename T >struct TreeNode {T val; // (1)TreeNode * left; // (2)TreeNode * right; // (3)TreeNode(): val(0), left(NULL), right(NULL) {} // (4)TreeNode(T x): val(x), left(NULL), right(NULL) {} // (5)};

(1) 定义了一个类型为 T 的成员变量 val,用于存储树节点的值。

(2) 定义了一个指向 TreeNode 类型的指针成员变量 left,用于存储左子结点的指针。

(3) 定义了一个指向 TreeNode 类型的指针成员变量 right,用于存储右子结点的指针。

(4) 定义了一个无参的构造函数,在创建树节点时将 val、left 和 right 都初始化为 NULL,并将 val 的值设置为 0。

(5) 定义了一个带参的构造函数,在创建树节点时将传入的参数赋值给 val,并将 left 和 right 都初始化为 NULL。

二、二叉树类的定义

template < typename T >class Tree {private:TreeNode < T > * nodes;TreeNode < T > * root;size_t nodeSize;TreeNode < T > * Create(T a[], int size, int nodeId, T nullNode); // (1)void visit(TreeNode < T > * node); // (2)void preOrder(TreeNode < T > * node); // (3)void inOrder(TreeNode < T > * node); // (4)void postOrder(TreeNode < T > * node); // (5)public:Tree(); // (6)Tree(int maxNodes); // (7)~Tree(); // (8)TreeNode < T > * GetTreeNode(int id); // (9)void CreateTree(T a[], int size, T nullNode); // (10)void preOrderTraversal(); // (11)void inOrderTraversal(); // (12)void postOrderTraversal(); // (13)};

(1) 这是一个模板函数声明,用于创建一个具有类型为 T 的树,是用于递归调用的。

(2) 这是一个成员函数声明,用于访问树结点(这里的实现就是打印结点的值)。

(3) 这是一个成员函数声明,用于前序遍历树结点。

(4) 这是一个成员函数声明,用于中序遍历树结点。

(5) 这是一个成员函数声明,用于后序遍历树结点。

(6) 这是构造函数声明,用于创建树结点池。

(7) 这是构造函数声明,用于创建一个具有最大结点数为 maxNodes 的树。

(8) 这是析构函数声明,用于销毁树对象并释放内存。

(9) 这是一个成员函数声明,用于获取指定编号的树结点。

(10) 这是一个成员函数声明,用于创建树。

(11) 这是一个成员函数声明,用于执行前序遍历。

(12) 这是一个成员函数声明,用于执行中序遍历。

(13) 这是一个成员函数声明,用于执行后序遍历。

三、二叉树的创建

template < typename T >Tree < T > ::Tree() {nodeSize = 100001;nodes = new TreeNode < T > [nodeSize];}template < typename T >Tree < T > ::Tree(int maxNodes) {nodeSize = maxNodes;nodes = new TreeNode < T > [nodeSize];}

这是两个不同参数的 Tree 的构造函数的实现,用来生成树的结点池。

四、二叉树的销毁

template<typename T>Tree<T>::~Tree() {delete[] nodes;}

当树销毁的时候,利用 delete 来清理结点池的内存空间。

五、获取二叉树的结点

template<typename T>TreeNode<T>* Tree<T>::GetTreeNode(int id) {return &nodes[id];}

通过 id 在 nodes 数组中索引,通过 O(1) 的时间复杂度内快速找到对应的树结点,然后再取地址并返回,就得到了 id 对应的树结点的地址。

六、访问二叉树的结点

template<typename T>void Tree<T>::visit(TreeNode<T> *node) {cout << node->val;}

用于访问传入的二叉树结点 node,为了体现二叉树的遍历,所以这里的实现是输出它的值。

七、二叉树的初始化

template < typename T >TreeNode < T > * Tree < T > ::Create(T a[], int size, int nodeId, T nullNode) {if (nodeId >= size || a[nodeId] == nullNode) {return NULL; // (1)}TreeNode < T > * nowNode = GetTreeNode(nodeId); // (2)nowNode -> val = a[nodeId]; // (3)nowNode -> left = Create(a, size, nodeId * 2, nullNode); // (4)nowNode -> right = Create(a, size, nodeId * 2 + 1, nullNode); // (5)return nowNode; // (6)}template < typename T >void Tree < T > ::CreateTree(T a[], int size, T nullNode) {root = Create(a, size, 1, nullNode); // (7)}

(1) 如果树结点编号 nodeId 大于等于数组大小 size,或者数组中编号为 nodeId 的元素的值等于空节点值 nullNode,则返回 NULL 表示创建一颗空树。

(2) 通过调用 GetTreeNode 方法获取编号为 nodeId 的树结点。

(3) 将数组中编号为 nodeId 的元素的值赋给当前树结点。

(4) 递归调用 Create 方法创建当前节点的左子结点,其中 nodeId 乘以 2 作为左子结点的编号。

(5) 递归调用 Create 方法创建当前节点的右子结点,其中 nodeId 乘以 2 加 1 作为右子结点的编号。

(6) 返回创建成功的树结点。

(7) 将根结点的指针设置为通过调用 Create 方法创建的树结点。

八、二叉树的前序遍历

template < typename T >void Tree < T > ::preOrder(TreeNode < T > * node) {if (node) {visit(node); // (1)preOrder(node -> left); // (2)preOrder(node -> right); // (3)}}template < typename T >void Tree < T > ::preOrderTraversal() {preOrder(root); // (4)}

(1) 调用 `visit` 函数访问当前树节点。

(2) 递归调用 `preOrder` 方法遍历当前节点的左子树。

(3) 递归调用 `preOrder` 方法遍历当前节点的右子树。

(4) 调用 `preOrder` 方法遍历根节点,即开始树的前序遍历。

九、二叉树的中序遍历

template < typename T >void Tree < T > ::inOrder(TreeNode < T > * node) {if (node) {inOrder(node -> left); // (1)visit(node); // (2)inOrder(node -> right); // (3)}}template < typename T >void Tree < T > ::inOrderTraversal() {inOrder(root); // (4)}

(1) 递归调用 `inOrder` 函数遍历当前节点的左子树。

(2) 调用 `visit` 函数访问当前树节点。

(3) 递归调用 `inOrder` 函数遍历当前节点的右子树。

(4) 调用 `inOrder` 函数遍历根节点,即开始树的中序遍历。

十、二叉树的后序遍历

template < typename T >void Tree < T > ::postOrder(TreeNode < T > * node) {if (node) {postOrder(node -> left); // (1)postOrder(node -> right); // (2)visit(node); // (3)}}template < typename T >void Tree < T > ::postOrderTraversal() {postOrder(root); // (4)}

(1) 递归调用 `postOrder` 函数遍历当前节点的左子树。

(2) 递归调用 `postOrder` 函数遍历当前节点的右子树。

(3) 调用 `visit` 函数访问当前树节点。

(4) 调用 `postOrder` 函数遍历根节点,即开始树的后序遍历。

十一、二叉树的完整源码

#include <iostream>using namespace std;template < typename T >struct TreeNode {T val;TreeNode * left;TreeNode * right;TreeNode(): val(0), left(NULL), right(NULL) {}TreeNode(T x): val(x), left(NULL), right(NULL) {}};template < typename T >class Tree {private:TreeNode < T > * nodes;TreeNode < T > * root;size_t nodeSize;TreeNode < T > * Create(T a[], int size, int nodeId, T nullNode);void visit(TreeNode < T > * node);void preOrder(TreeNode < T > * node);void inOrder(TreeNode < T > * node);void postOrder(TreeNode < T > * node);public:Tree();Tree(int maxNodes);~Tree();TreeNode < T > * GetTreeNode(int id);void CreateTree(T a[], int size, T nullNode);void preOrderTraversal();void inOrderTraversal();void postOrderTraversal();};template < typename T >Tree < T > ::Tree() {nodeSize = 100001;nodes = new TreeNode < T > [nodeSize];}template < typename T >Tree < T > ::Tree(int maxNodes) {nodeSize = maxNodes;nodes = new TreeNode < T > [nodeSize];}template < typename T >Tree < T > ::~Tree() {delete[] nodes;}template < typename T >TreeNode < T > * Tree < T > ::GetTreeNode(int id) {return & nodes[id];}template < typename T >void Tree < T > ::visit(TreeNode < T > * node) {cout << node -> val;}template < typename T >TreeNode < T > * Tree < T > ::Create(T a[], int size, int nodeId, T nullNode) {if (nodeId >= size || a[nodeId] == nullNode) {return NULL;}TreeNode < T > * nowNode = GetTreeNode(nodeId);nowNode -> val = a[nodeId];nowNode -> left = Create(a, size, nodeId * 2, nullNode);nowNode -> right = Create(a, size, nodeId * 2 + 1, nullNode);return nowNode;}template < typename T >void Tree < T > ::CreateTree(T a[], int size, T nullNode) {root = Create(a, size, 1, nullNode);}template < typename T >void Tree < T > ::preOrder(TreeNode < T > * node) {if (node) {visit(node);preOrder(node -> left);preOrder(node -> right);}}template < typename T >void Tree < T > ::preOrderTraversal() {preOrder(root);}template < typename T >void Tree < T > ::inOrder(TreeNode < T > * node) {if (node) {inOrder(node -> left);visit(node);inOrder(node -> right);}}template < typename T >void Tree < T > ::inOrderTraversal() {inOrder(root);}template < typename T >void Tree < T > ::postOrder(TreeNode < T > * node) {if (node) {postOrder(node -> left);postOrder(node -> right);visit(node);}}template < typename T >void Tree < T > ::postOrderTraversal() {postOrder(root);}int main(){const char nullNpde = '-';char a[15] = {nullNpde,'a','b','c','d',nullNpde,'e','f','g','h',nullNpde,nullNpde,nullNpde,nullNpde,'i'};Tree < char > T(15);T.CreateTree(a, 15, nullNpde);T.preOrderTraversal();cout << endl;T.inOrderTraversal();cout << endl;T.postOrderTraversal();cout << endl;return 0;}

题集

1. 单值二叉树

​ 2. 完全二叉树的节点个数

3. ​二叉树的前序遍历

​ 4. ​二叉树的中序遍历

​ 5. ​二叉树的后序遍历

​ 6. 翻转二叉树

​ 7. 从根到叶的二进制数之和

性质

单值二叉树

相同的树

对称二叉树

剑指 Offer 28. 对称的二叉树

二叉树的最大深度

剑指 Offer 55 - I. 二叉树的深度

二叉树的最小深度

完全二叉树的节点个数

二叉树的堂兄弟节点

另一棵树的子树

先序遍历

二叉树的前序遍历

找出克隆二叉树中的相同节点

二叉树展开为链表

二叉树的所有路径

从根到叶的二进制数之和

剑指 Offer II 045. 二叉树最底层最左边的值

剑指 Offer II 049. 从根节点到叶节点的路径数字之和

叶子相似的树

左叶子之和

路径总和

特定深度节点链表

最大二叉树

路径总和 II

统计二叉树中好节点的数目

中序遍历

二叉树的中序遍历

后序遍历

二叉树的后序遍历

二叉树的坡度

二叉树剪枝

剑指 Offer II 047. 二叉树剪枝

统计最高分的节点数目

层序遍历

二叉树的层序遍历

剑指 Offer 32 - I. 从上到下打印二叉树

最大层内元素和

剑指 Offer 32 - II. 从上到下打印二叉树 II

剑指 Offer 32 - III. 从上到下打印二叉树 III

二叉树的层序遍历 II

填充每个节点的下一个右侧节点指针 II

二叉树的层平均值

二叉树的锯齿形层序遍历

剑指 Offer II 045. 二叉树最底层最左边的值

找树左下角的值

剑指 Offer II 044. 二叉树每层的最大值

在每个树行中找最大值

二叉树的右视图

剑指 Offer II 046. 二叉树的右侧视图

在二叉树中分配硬币

构造 && 思维

合并二叉树

从前序与中序遍历序列构造二叉树

从中序与后序遍历序列构造二叉树

序列化和反序列化二叉搜索树

二叉树的序列化与反序列化

剑指 Offer 37. 序列化二叉树

剑指 Offer II 048. 序列化与反序列化二叉树

从先序遍历还原二叉树

LCA

剑指 Offer 68 - I. 二叉搜索树的最近公共祖先

剑指 Offer 68 - II. 二叉树的最近公共祖先

二叉搜索树的最近公共祖先

二叉树的最近公共祖先

首个共同祖先

具有所有最深节点的最小子树

最深叶节点的最近公共祖先

从二叉树一个节点到另一个节点每一步的方向

多低调:性质里的第四题:[剑指 Offer 28. 对称的二叉树]链接错了,应该是(力扣

wian:性质里的第六题:[剑指 Offer 55 - I. 二叉树的深度]链接错了,应该是力扣

多低调:性质里的倒数第三题:[完全二叉树的节点个数] 链接错了,应该是(力扣

Ivor:后序遍历的第3~4题:二叉树剪枝、剑指offerII二叉树剪枝 链接错了,应该是 力扣 、力扣

Ivor:后序遍历的第五题,统计最高分节点数目 链接错了,应该是 力扣

多低调:先序遍历里的第五题:[1022. 从根到叶的二进制数之和]链接错了,应该是(力扣)

多低调:先序遍历里的第七题:[剑指 Offer II 049. 从根节点到叶节点的路径数字之和]链接错了,应该是(力扣)

多低调:先序遍历里的第九题:【404. 左叶子之和】链接错了,应该是(力扣)

多低调:先序遍历里的第十题:【112. 路径总和】链接错了,应该是(力扣)

多低调:先序遍历里的倒数第二题:【113. 路径总和 II】链接错了,应该是(力扣)

低调:先序遍历里的最后一题:【1448. 统计二叉树中好节点的数目】链接错了,应该是(https://leetcode.cn/problems/count-good-nodes-in-b...)

多低调:中序遍历里的最后一题:【94. 二叉树的中序遍历】链接错了,应该是(力扣)

切糕子:层序遍历里的第二题:[剑指 Offer 32 - I. 从上到下打印二叉树]链接错了,应该是(. - 力扣(LeetCode))

切糕子:层序遍历里的第九题:[二叉树的锯齿形层序遍历]链接错了,应该是(. - 力扣(LeetCode))

切糕子:层序遍历里的倒数第二题:[剑指 Offer II 046. 二叉树的右视图]链接错了,应该是(. - 力扣(LeetCode))

切糕子:构造 && 思维里的第四题:[序列化和反序列化二叉搜索树]链接错了,应该是(. - 力扣(LeetCode))

切糕子:构造 && 思维里的倒数第一题:[从先序遍历还原二叉树]链接错了,应该是(. - 力扣(LeetCode))

切糕子:LCA里的第一题:[剑指 Offer 68 - I. 二叉搜索树的最近公共祖先]链接错了,应该是(. - 力扣(LeetCode))

切糕子:LCA里的第三题:[二叉搜索树的最近公共祖先]链接错了,应该是(. - 力扣(LeetCode))

切糕子:LCA里的第四题:[二叉树的最近公共祖先]链接错了,应该是(. - 力扣(LeetCode))

切糕子:LCA里的倒数第三题:[具有所有最深节点的最小子树]链接错了,应该是(. - 力扣(LeetCode))

切糕子:LCA里的倒数第二题:[最深叶节点的最近公共祖先]链接错了,应该是(. - 力扣(LeetCode))

切糕子:LCA里的倒数第一题:[从二叉树一个节点到另一个节点每一步的方向]链接错了,应该是(. - 力扣(LeetCode))

相关文章:

基础数据结构--二叉树

一、二叉树的定义 二叉树是 n( n > 0 ) 个结点组成的有限集合&#xff0c;这个集合要么是空集&#xff08;当 n 等于 0 时&#xff09;&#xff0c;要么是由一个根结点和两棵互不相交的二叉树组成。其中这两棵互不相交的二叉树被称为根结点的左子树和右子树。 如图所示&am…...

《C++设计模式》策略模式

文章目录 1、引言1.1 什么是策略模式1.2 策略模式的应用场景1.3 本文结构概览 2、策略模式的基本概念2.1 定义与结构2.2 核心角色解析2.2.1 策略接口&#xff08;Strategy&#xff09;2.2.2 具体策略实现&#xff08;ConcreteStrategy&#xff09;2.2.3 上下文&#xff08;Cont…...

JavaScript学习记录6

第一节 算数运算符 1. 概述 JavaScript 共提供10个算术运算符&#xff0c;用来完成基本的算术运算。 加法运算符x y减法运算符 x - y乘法运算符 x * y除法运算符x / y指数运算符x ** y余数运算符x % y自增运算符x 、x自减运算符--x 、x--数值运算符 x负数值运算符-x 减法、…...

如何在没有 iCloud 的情况下将数据从 iPhone 传输到 iPhone

概括 您可能会遇到将数据从 iPhone 转移到 iPhone 的情况&#xff0c;尤其是当您获得新的 iPhone 15/14 时&#xff0c;您会很兴奋并希望将数据转移到它。 使用iCloud最终可以做到这一点&#xff0c;但它的缺点也不容忽视&#xff0c;阻碍了你选择它。例如&#xff0c;您需要…...

Doris安装部署

Doris 概述 Apache Doris由百度大数据部研发&#xff08;之前叫百度 Palo&#xff0c;2018年贡献到 Apache 社区后&#xff0c;更名为 Doris &#xff09;&#xff0c;在百度内部&#xff0c;有超过200个产品线在使用&#xff0c;部署机器超过1000台&#xff0c;单一业务最大可…...

[服务器][教程]Ubuntu24.04 Server开机自动挂载硬盘教程

1. 查看硬盘ID ls -l /dev/disk/by-uuid可以看到对应的UUID所对应的分区 2. 创建挂载文件夹 创建好文件夹即可 3. 修改配置文件 sudo vim /etc/fstab把对应的UUID和创建的挂载目录对应即可 其中# Personal mount points下面的是自己新添加的 &#xff1a;分区定位&#xff…...

io多路复用, select, poll, epoll

系列文章目录 异步I/O操作函数aio_xxx函数 https://blog.csdn.net/surfaceyan/article/details/134710393 文章目录 系列文章目录前言一、5种IO模型二、IO多路复用APIselectpollepoll 三、两种高效的事件处理模式Reactor模式Proactor模式模拟 Proactor 模式基于事件驱动的非阻…...

k8s-1.28.2 部署prometheus

一、prometheus helm仓库 ## 网站地址 # https://artifacthub.io/## prometheus 地址 # https://artifacthub.io/packages/helm/prometheus-community/prometheus. # helm repo add prometheus-community https://prometheus-community.github.io/helm-charts # helm repo …...

记录第一次跑YOLOV8做目标检测

今天是24年的最后一天&#xff0c;终于要向新世界开始破门了&#xff0c;开始深度学习&#xff0c;YOLO来敲门~ 最近做了一些皮肤检测的功能&#xff0c;在传统的处理中经历了反复挣扎&#xff0c;终于要上YOLO了。听过、看过&#xff0c;不如上手体会过~ 1、YOLO是什么&#x…...

使用Python爬取BOSS直聘职位数据并保存到Excel

使用Python爬取BOSS直聘职位数据并保存到Excel 在数据分析和挖掘中&#xff0c;爬取招聘网站数据是一项常见的任务。本文将详细介绍如何使用Python爬取BOSS直聘上与“测试工程师”相关的职位数据&#xff0c;并将其保存到Excel文件中。通过逐步分解代码和添加详细注释&#xf…...

node.js之---集群(Cluster)模块

为什么会有集群&#xff08;Cluster&#xff09;模块&#xff1f; 集群&#xff08;Cluster&#xff09;模块的作用 如何使用集群&#xff08;Cluster&#xff09;模块&#xff1f; 为什么会有集群&#xff08;Cluster&#xff09;模块 Node.js 是基于 单线程事件驱动 模型的…...

SSM-Spring-IOC/DI对应的配置开发

目录 一、IOC 控制反转 1.什么是控制反转呢 2. Spring和IOC之间的关系是什么呢? 3.IOC容器的作用以及内部存放的是什么? 4.当IOC容器中创建好service和dao对象后&#xff0c;程序能正确执行么? 5.Spring 容器管理什么内容&#xff1f; 6.如何将需要管理的对象交给 …...

一文大白话讲清楚CSS元素的水平居中和垂直居中

文章目录 一文大白话讲清楚CSS元素的水平居中和垂直居中1.已知元素宽高的居中方案1.1 利用定位margin:auto1.2 利用定位margin负值1.3 table布局 2.未知元素宽高的居中方案2.1利用定位transform2.2 flex弹性布局2.3 grid网格布局 3. 内联元素的居中布局 一文大白话讲清楚CSS元素…...

航顺芯片推出HK32A040方案,赋能汽车矩阵大灯安全与智能化升级

汽车安全行驶对整车照明系统的要求正在向智能化方向发展。车灯位于汽车两侧&#xff0c;前期有各种各样的实现包括氙气灯、LED灯等等光源技术。矩阵大灯对汽车照明系统朝着安全性和智能化兼具的方向发展起到了重要推动作用。矩阵大灯可以精细控制到每一个小灯珠&#xff0c;从而…...

智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之12 方案再探:特定于领域的模板 之2 首次尝试和遗留问题解决

本文提要 现在就剩下“体”本身的 约定了--这必然是 自律自省的&#xff0c;或者称为“戒律” --即“体”的自我训导discipline。完整表述为&#xff1a; 严格双相的庄严“相” (<head>侧&#xff09;&#xff0c;完全双性的本质“性”&#xff08;<boot>侧&…...

redis zset底层实现

1.Redis zset底层实现 转载自&#xff1a;https://marticles.github.io/2019/03/19/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Redis-Zset%E5%8E%9F%E7%90%86/ zset底层是压缩列表 跳表实现的。 跳表里面又由字典hash表 跳表实现。 什么时候用压缩列表&#xff1f;什么时候用…...

go.Bar如何让hovertext显示为legend

在 Plotly 的 go.Bar 图中&#xff0c;如果你想让鼠标悬停时 (hover) 显示的文本 (hovertext) 与图例 (legend) 一致&#xff0c;可以通过 hovertemplate 来控制悬停时的显示内容。 实现方法 hovertemplate 是一种自定义工具&#xff0c;允许你完全控制悬停时的文本显示格式。…...

【Vue】分享一个快速入门的前端框架以及如何搭建

先上效果图: 登录 菜单: 下载地址: 链接&#xff1a;https://pan.baidu.com/s/1m-ZlBARWU6_2n8jZil_RAQ 提取码&#xff1a;ui20 … 主要是可以自定义设置token,更改后端请求地址较为方便。 应用设置: 登录与token设置: 在这里设置不用登录,可以请求的接口: request.js i…...

Flink源码解析之:如何根据JobGraph生成ExecutionGraph

Flink源码解析之&#xff1a;如何根据JobGraph生成ExecutionGraph 在上一篇Flink源码解析中&#xff0c;我们介绍了Flink如何根据StreamGraph生成JobGraph的流程&#xff0c;并着重分析了其算子链的合并过程和JobGraph的构造流程。 对于StreamGraph和JobGraph的生成来说&…...

UE(虚幻)学习(三) UnrealSharp插件中调用非托管DLL

上一篇文章中我使用UnrealSharp成功使用了我的一个C#控制台程序中的网络模块&#xff0c;这个程序是基于KCP网络了&#xff0c;其中调用了Cmake 编译的一个C的DLL&#xff0c;在虚幻中DLL需要放在Binaries目录中才可以。Unity中只要放在任意Plugins目录中就可以。 但是Binaries…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...