【C++】二叉树相关算法题
一、根据二叉树创建字符串
题目描述:
给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。
空节点使用一对空括号对 “()” 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
题目示例:
分析: 根据题意,我们可以观察出一下规律:
- 根据题意,如果左子树为空,右子树不为空,就需要加空()
- 如果右子树为空,就不需要加空()
- 左右子树都为空,就不需要加空()
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:string str = "";string tree2str(TreeNode* root) {if (root == nullptr)return "";str += to_string(root->val);//根据题意,如果左子树为空,右子树不为空,就需要加空()//如果右子树为空,就不需要加空()//左右子树都为空,就不需要加空()if (root->left || root->right){str += '(';tree2str(root->left);str += ')';}if (root->right){str += '(';tree2str(root->right);str += ')';}return str;}
};
二、二叉树的层序遍历
题目描述:
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
题目示例:
分析:
通过层序遍历二叉树,我们可以通过队列来实现,利用队列先进先出的特点对二叉树进行层序遍历,控制每一层的节点的个数,来实现层序遍历。
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),* right(right) {}* };*/
class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> vv;queue<TreeNode*> q;int levelsize = 0;if(root){levelsize = 1;q.push(root);}while(q.size()){vector<int> v;while(levelsize--){TreeNode* front = q.front();q.pop();v.push_back(front->val);if(front->left)q.push(front->left);if(front->right)q.push(front->right);}levelsize = q.size();vv.push_back(v);}return vv;}
};
三、二叉树的层序遍历 II
题目描述:
给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
题目示例:
分析:
思路和上面一样,只需要将上面返回的vector数组逆转就行
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> vv;queue<TreeNode*> q;int levelsize = 0;if(root){levelsize = 1;q.push(root);}while(q.size()){vector<int> v;while(levelsize--){TreeNode* front = q.front();q.pop();v.push_back(front->val);if(front->left)q.push(front->left);if(front->right)q.push(front->right);}levelsize = q.size();vv.push_back(v);}reverse(vv.begin(),vv.end());return vv;}
};
四、二叉树的最近公共祖先
题目描述:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。
题目示例:
分析:
- 第一种思路(时间复杂度O(N^2))
我们可以通过观察规律,发现两个节点要不分布在最近祖先的两个不同的子树中,要不分布在最近祖先的同一个子树中(包含祖先),于是我们就可以遍历树中的每一个节点,如果祖先的左右子树中是否有这两个节点或如果祖先本身就是需要查找的节点,就只需要看左子树或右子树是否存在另一个节点,如果有,就证明其是最近的公共祖先。
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:bool IsIntree(TreeNode* root,TreeNode* p,TreeNode* q){if(root == nullptr)return false;if(root->val == p->val || root->val == q->val)return true;bool left = IsIntree(root->left,p,q);bool right = IsIntree(root->right,p,q);return left || right;}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root == nullptr)return nullptr;//p是自己的祖然后在查找q是否在左子树或右子树if(root->val == p->val && (IsIntree(root->left,p,q) || IsIntree(root->right,p,q))){return root;}//q是自己的祖然后在查找p是否在左子树或右子树else if(root->val == q->val && (IsIntree(root->left,p,q) || IsIntree(root->right,p,q))){return root;}//p,q在不在左子树或右子树中的任意一棵树else if(IsIntree(root->left,p,q) && IsIntree(root->right,p,q)){return root;}//这个节点不是最近公共祖先else {TreeNode* Inright = lowestCommonAncestor(root->left,p,q);if(Inright)//不是nullptr就表示这个节点是最近公共祖先return Inright;TreeNode* Inleft = lowestCommonAncestor(root->right,p,q);if(Inleft)//不是nullptr就表示这个节点是最近公共祖先return Inleft;return nullptr;}}
};
- 第二种思路(时间复杂度O(N))
通过前序遍历左子树和右子树,找到对应的节点,并用栈存储从根节点到对应节点的路劲,最后模拟两个链表找交点的情况,长的栈先出栈,直到两个栈的大小相等,在一起出栈,直到两个出栈的节点值相等,就表示其是最近的公共祖先
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:bool GetPath(TreeNode* root,TreeNode* node,stack<TreeNode*>& Path){if(root == nullptr)return false;Path.push(root);if(root == node)return true;bool left = GetPath(root->left,node,Path);bool right = GetPath(root->right,node,Path);if(!right && !left)Path.pop();return left || right;//左子树和右子树都没有找到}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {stack<TreeNode*> ppath,qpath;GetPath(root,p,ppath);GetPath(root,q,qpath);while(ppath.size() > qpath.size()){ppath.pop();}while(qpath.size() > ppath.size()){qpath.pop();}while(qpath.top() != ppath.top()){qpath.pop();ppath.pop();}return ppath.top();}
};
五、将二叉搜索树转化为排序的双向链表
题目描述:
将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 。
对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
特别地,我们希望可以 就地 完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中最小元素的指针。
题目示例:
分析:
由题目给出条件,可知该二叉树是二叉搜索树,这题需要我们把二叉搜索树转换为 升序排列 的链表,我们知道二叉搜索树的升序遍历是 中序遍历 ,于是我们就可以定义两个指针 cur 和 prev ,cur 指向当前节点, prev 指向当前节点的上一个节点,通过 中序遍历 树的每一个节点,当当前节点 cur 的左子树遍历完,cur->left = prev ,通过改变前驱和后继的指针的指向,来把其链接已排序的双向循环链表.
/*
// Definition for a Node.
class Node {
public:int val;Node* left;Node* right;Node() {}Node(int _val) {val = _val;left = NULL;right = NULL;}Node(int _val, Node* _left, Node* _right) {val = _val;left = _left;right = _right;}
};
*/
class Solution {
public:void Link(Node* cur,Node*& prev){if(cur == nullptr)return;Link(cur->left,prev);cur->left = prev;if(prev)prev->right = cur;prev = cur;Link(cur->right,prev);}Node* treeToDoublyList(Node* root) {if(root == nullptr)return nullptr;Node* cur = root;Node* prev = nullptr;Link(cur,prev);Node* tail = prev;while(root->left){root = root->left;}Node* head = root;head->left = tail;tail->right = head;return head;}
};
六、从前序与中序遍历序列构造二叉树
题目描述:
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历,inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点
题目示例:
分析: 根据前序就可以确定根节点,根据中序就可以确定根节点的左右子树,用区间来表示根节点的左右子树区间,最后就可以确定出整个二叉树。
class Solution {
public://pre_begin,pre_endTreeNode* buildTree_with_pre_in(vector<int>& preorder, vector<int>& inorder,int& pospre,int in_begin,int in_end){if(in_begin > in_end){return nullptr;}//if(pospre <= inorder.size() - 1)TreeNode* newnode = new TreeNode(preorder[pospre++]);int pos;for(int i = in_begin;i <= in_end;i++){if(inorder[i] == newnode->val){pos = i;break;}}if(pospre > inorder.size() - 1)pospre = inorder.size() - 1;TreeNode* left = buildTree_with_pre_in(preorder,inorder,pospre,in_begin,pos - 1);// 左子树if(pospre > inorder.size() - 1)pospre = inorder.size() - 1;TreeNode* right = buildTree_with_pre_in(preorder,inorder,pospre,pos + 1,in_end);// 右子树newnode->left = left;newnode->right = right;return newnode;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int i = 0;TreeNode* root = buildTree_with_pre_in(preorder,inorder,i,0,inorder.size() - 1);return root;}
};
七、从中序与后序遍历序列构造二叉树
题目描述:
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历,postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
题目示例:
分析: 与上面的题目类似,只不过是后序遍历,根据后序遍历的特点:左子树-右子树-根节点的特点,我们可以发现把后序反过来,就可以确定根节点的位置,然后再根据中序判断右子树和左子树的位置,其实就是一个 根-右子树-左子树 的过程来创建树,而前序创建树的就是 根-左子树-右子树 ,和前序相比就是遍历子树的顺序变了而已。
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* buildTree_with_in_post(vector<int>& inorder,vector<int>& postorder,int& pospost,int in_begin,int in_end){if(in_begin > in_end)return nullptr;TreeNode* newnode = new TreeNode(postorder[pospost--]);int pos = -1;for(int i = in_begin;i <= in_end;i++){if(inorder[i] == newnode->val){pos = i;break;}}TreeNode* right = buildTree_with_in_post(inorder,postorder,pospost,pos + 1,in_end);TreeNode* left = buildTree_with_in_post(inorder,postorder,pospost,in_begin,pos - 1);newnode->left = left;newnode->right = right;return newnode;}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {int i = postorder.size() - 1;//从后序的最后一个节点开始TreeNode* root = buildTree_with_in_post(inorder,postorder,i,0,postorder.size() - 1);return root;}
};
八、非递归实现二叉树的前序遍历
题目描述: 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
题目示例:
分析: 要迭代⾮递归实现⼆叉树前序遍历,⾸先还是要借助递归的类似的思想,只是需要把结点存在栈中,⽅便类似递归回退时取父路径结点。跟这⾥不同的是,这⾥把⼀棵⼆叉树分为两个部分:
- 先访问左路结点
- 再访问左路结点的右⼦树
这⾥访问右⼦树要以循环从栈依次取出这些结点,循环⼦问题的思想访问左路结点的右⼦树。前序遍历的顺序为 根-左子树-右子树 ,我们每次访问一个节点,后需要把它入栈,就可以实现前序遍历。
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {vector<int> v;if(root == nullptr)return v;stack<TreeNode*> st;st.push(root);v.emplace_back(root->val);while(root->left){root = root->left;v.emplace_back(root->val);st.push(root);}while(st.size()){TreeNode* cur = st.top();st.pop();cur = cur->right;if(cur){st.push(cur);v.emplace_back(cur->val);}while(cur && cur->left){cur = cur->left;v.emplace_back(cur->val);st.push(cur);}}return v;}
};
九、非递归实现二叉树的中序遍历
题目描述: 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
题目示例:
分析:
中序访问的顺序是 左子树-根-右子树 ,每当访问玩左子树的时候,就将栈顶数据入栈,即可实现中序遍历二叉树
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int> v;if(root == nullptr)return v;stack<TreeNode*> st;st.push(root);while(root->left){root = root->left;st.push(root);}while(st.size()){TreeNode* cur = st.top();v.emplace_back(cur->val); st.pop();cur = cur->right;if(cur){st.push(cur);}while(cur && cur->left){cur = cur->left;st.push(cur);}}return v;}
};
十、非递归实现二叉树的后序遍历
题目描述: 给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。
题目示例:
分析::
后序遍历的需要先访问顺序为 左子树-右子树-根 , 首先我们先把根节点 root 左子树的节点全部加入栈,我们想要访问根,就必须先把根的左子树和右子树都访问完,于是我们就需要用 prev 来表示它当前节点的前一个节点,如果 cur->right == nullptr || cur->right == prev 就表示当前根节点的左子树和右子树都访问完了,然后再出栈,并且不需要向下访问了。
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {vector<int> v;if(root == nullptr)return v;stack<TreeNode*> st;st.push(root);TreeNode* prev = nullptr;while(root->left){root = root->left;st.push(root);}while(st.size()){TreeNode* cur = st.top();if(cur->right == nullptr || cur->right == prev){st.pop();v.emplace_back(cur->val);prev = cur;continue;}cur = cur->right;if(cur){st.push(cur);}while(cur && cur->left){cur = cur->left;st.push(cur);}}return v;}
};
相关文章:

【C++】二叉树相关算法题
一、根据二叉树创建字符串 题目描述: 给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。 空节点使用一对空括号对 “()” 表示,转化后需要省略所有…...

物联网IoT系列之MQTT协议基础知识
文章目录 物联网IoT系列之MQTT协议基础知识物联网IoT是什么?什么是MQTT?为什么说MQTT是适用于物联网的协议?MQTT工作原理核心组件核心机制 MQTT工作流程1. 建立连接2. 发布和订阅3. 消息确认4. 断开连接 MQTT工作流程图MQTT在物联网中的应用 …...

【大学生体质】智能 AI 旅游推荐平台(Vue+SpringBoot3)-完整部署教程
智能 AI 旅游推荐平台开源文档 项目前端地址 ☀️项目介绍 智能 AI 旅游推荐平台(Intelligent AI Travel Recommendation Platform)是一个利用 AI 模型和数据分析为用户提供个性化旅游路线推荐、景点评分、旅游攻略分享等功能的综合性系统。该系统融合…...
【Node.js入门笔记1---初始Node.js)】
Node.js入门笔记1 初始Node.js1.Node.js简介2.Node.js中js的运行环境3.Node.js 可以做什么4.Node.js 怎么学 初始Node.js 1.Node.js简介 Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境,用于在服务器端运行 JavaScript 代码。它让开发者可以用 Java…...

自学Java-JavaSE基础加强(多线程)
自学Java-JavaSE基础加强(多线程) 一、创建线程1、方式一:继承Thread类小结 2、方式二:实现Runnable接口小结 3、方式三:实现Callable接口4、小结 二、线程的常用方法三、线程安全1、认识线程安全2、模拟线程安全问题3…...

数字后端培训实战项目六大典型后端实现案例
Q1:请教一个问题,cts.sdc和func.sdc在innovus用如何切换?在flow哪一步切换输入cts.sdc?哪一步切换到func.sdc,具体如何操作? 这个学员其实就是在问使用分段长clock tree时具体的flow流程是怎么样的?针对时…...

安卓免费多功能工具:一站式解决 PDF 阅读、编辑、转换等需求
软件介绍 今天要给大家介绍一款功能强大的PDF处理软件——PDFgear Android版。它是专为安卓设备打造的,完全免费,无需破解和激活就能使用。 此前,我们分享过它的桌面端,收获了大家的一致好评。今天要着重介绍的手机APP版本&…...

diffuser库使用本地模型生成图像
实验目的 使用diffuser库生成图像的文章是很多的,使用方法也并不复杂,安装库后调用现成的模型和接口即可,但是因为网络原因,模型下载总会遇到问题,对于使用服务器的研究者来说,挂梯子并不可行,…...
递归—基础算法
#基线条件和递归条件 #每个递归函数都有两部分:基线条件和递归条件。递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。 #栈:栈是一种数据结构,它是一种线性数据结构,…...
全面复习回顾——C++语法篇2
23、字符串相加 string s3;s3s1s2;cout<<s3; 24、结构体基本操作 struct student {// write your code here......string name;int age;double height0.0; };int main() {// write your code here......student s;cin>>s.name;cin>>s.age;cin>>s.hei…...

探秘基带算法:从原理到5G时代的通信变革【十】基带算法应用与对比
文章目录 三、算法在现代通信系统中的应用3.1 5G 通信中的应用3.1.1 信道编码与调制解调3.1.2 大规模 MIMO 技术3.1.3 案例分析:5G 基站与终端实现 3.2 卫星通信中的应用3.2.1 抗干扰与纠错编码3.2.2 信号处理与调制解调3.2.3 案例分析:卫星通信系统实例…...

Linux | Vim 鼠标不能右键粘贴、跨系统复制粘贴
注:本文为 “ Vim 中鼠标右键粘贴、跨系统复制粘贴问题解决方案” 相关文章合辑。 未整理去重。 Linux 入门:vim 鼠标不能右键粘贴、跨系统复制粘贴 foryouslgme 发布时间 2016 - 09 - 28 10:24:16 Vim 基础 命令模式(command - mode&…...

无人机遥控器扩频技术解析!
一、扩频技术基本原理 扩频技术(Spread Spectrum, SS)通过将信号的频谱扩展至远大于原始带宽进行传输,提升抗干扰性、隐蔽性和多用户能力。其核心原理包括: 直接序列扩频(DSSS) 利用高速伪随机码&#x…...
Spring Boot API 项目中 HAProxy 与 Nginx 的选择与实践
在开发 Spring Boot 构建的 RESTful API 项目时,负载均衡和反向代理是提升性能与可用性的关键环节。HAProxy 和 Nginx 作为两种流行的工具,经常被用于流量分发,但它们各有侧重。究竟哪一个更适合你的 Spring Boot API 项目?本文将…...
OpenBMC:BmcWeb构造connect对象
OpenBMC:BmcWeb server.run-CSDN博客 server在接收了tcp连接请求后,会构造一个ConnectionType对象,然后通过post调度,运行该对象的start函数 1.ConnectionType类型 其实也就是using ConnectionType = Connection<Adaptor, Handler>;类型 由于ConnectionType实例化于…...

ORB-SLAM2源码学习(六):相机跟踪(局部地图跟踪和关键帧创建)
目录 1.局部地图跟踪 1.1 更新局部关键帧UpdateLocalKeyFrames 1.2 更新局部地图点(来自局部关键帧)UpdateLocalPoints() 1.3 投影匹配 2. 对比四种跟踪方式以及使用的投影匹配 3.关键帧创建 3.1 判断是否需要创建新关键帧: NeedNewKeyFrame() 3…...
WordPress使用(3)
前面文章讲述了如何利用docker进行wordpress系统的安装及相关设置,本文将介绍如何进行站点数据和数据库数据的备份。 1. 备份数据库 # 进入mysql容器内部 docker exec -it mysqlwp bash# 使用mysqldump 命令导出数据库 mysqldump -u root -p wordpress > wordp…...

Docker基础篇——什么是Docker与Docker的仓库、镜像、容器三大概念
大家好我是木木,在当今快速发展的云计算与云原生时代,容器化技术蓬勃兴起,Docker 作为实现容器化的主流工具之一,为开发者和运维人员带来了极大的便捷 。下面我们一起了解下什么是Docker与与Docker的仓库、镜像、容器三大概念。 …...

Gitlab配置personal access token
1.点击左上角个人账号 -> Preferences 2. 点击左边栏 Access Tokens 3. 点击Add new token ,输入token名称,勾选权限(注意截至日期 “Expiration date” 可不填) 4. 创建成功后,显示token信息,复制到本地…...

使用STM32CubeMX实现LED灯每秒闪烁一次(STM32G070CBT6单片机)
1.打开STM32CubeMX,点击File->New Project,新建一个新工程。 2.搜索芯片型号,选择正确的芯片封装规格,准备对芯片的引脚进行配置。 进行上面的操作后,跳转到如下的页面。 3.选择要配置的引脚进行配置。此处我的LED是…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

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

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...