【递归、搜索和回溯】二叉树中的深搜
个人主页 : zxctscl
专栏 【C++】、 【C语言】、 【Linux】、 【数据结构】、 【算法】
如有转载请先通知
文章目录
- 前言
- 1 2331. 计算布尔二叉树的值
- 1.1 分析
- 1.2 代码
- 2 129. 求根节点到叶节点数字之和
- 2.1 分析
- 2.2 代码
- 3 814. 二叉树剪枝
- 3.1 分析
- 3.2 代码
- 4 98. 验证二叉搜索树
- 4.1 分析
- 4.2 代码
- 5 230. 二叉搜索树中第 K 小的元素
- 5.1 分析
- 5.2 代码
- 6 257. 二叉树的所有路径
- 6.1 分析
- 6.2 代码
前言
上一篇提到递归、搜索和回溯介绍: 【递归、搜索和回溯】递归、搜索和回溯介绍及递归类算法例题,继续来看着类型的题目
1 2331. 计算布尔二叉树的值
1.1 分析
看一下例一:把数字按题目换算成符号就是图片右边这样的情况,false&true=false,true|false=true。最后结果结果就是true。
算法原理:递归(dfs)
重复子问题:
主问题就是这棵树是true还是false,左子树是true还是false,把左子树传过去;右子树是true还是false,把右子树传过去。函数头bool dfs(root)
函数体:bool left=dfs(root->left);bool right=dfs(root->right);再把左右子树按规则计算
出口:遇到叶子节点就返回结果
1.2 代码
/*** 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:bool evaluateTree(TreeNode* root) {if(root->left==nullptr)return root->val==0?false:true;bool left=evaluateTree(root->left);bool right=evaluateTree(root->right);return root->val==2?left|right:left&right;}
};
2 129. 求根节点到叶节点数字之和
2.1 分析
算法:递归
函数头:
传一个节点,计算与它相连的所有叶子结点的和
int dfs(root,presum)
函数体:计算节点5的值,那么第一步就得拿到到5时前面的值,也就是125,第二步,拿到它左子树值1258,第三步拿到它右子树的值12594+125931=138525,第四步,将左右两边相加1258+138525
递归出口:叶子结点
2.2 代码
/*** 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:int sumNumbers(TreeNode* root) {return dfs(root,0);}int dfs(TreeNode* root,int presum){presum=presum*10+root->val;if(root->left==nullptr&&root->right==nullptr)return presum;int ret=0;if(root->left)ret+=dfs(root->left,presum);if(root->right)ret+=dfs(root->right,presum);return ret;}
};
3 814. 二叉树剪枝
3.1 分析
里面所有包含0的子树全部剪掉
算法原理:递归
通过决策树,抽象出递归的三个核心问题
遇到0的时候,要先判断它的左子树和右子树是否是0,就要用到后序遍历。
当后序遍历节点的左子树遇到0后用null返回,如果左子树没有改变,就直接返回它的值。
函数头 Node* dfs(root)
函数体
(1)处理左子树
(2)处理右子树
(3)判断
递归出口
当root为空就返回
3.2 代码
/*** 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* pruneTree(TreeNode* root) {if(root==nullptr)return nullptr;root->left=pruneTree(root->left);root->right=pruneTree(root->right);if(root->left==nullptr&&root->right==nullptr&&root->val==0){root=nullptr;}return root;}
};
4 98. 验证二叉搜索树
4.1 分析
二叉搜索树的中序遍历的结果,是一个有序的序列用这个性质来做这道题。
用一个全局变量prev,让这个全局变量先初始化为负无穷大,当在进行中序遍历的时候,到一个节点的时候,prev记录它的前面遍历节点的值,拿prev和当前节点的值比较后,更新prev的值,继续遍历,是有序的就继续遍历,更新。
算法:递归
策略一:
左子树是二叉搜索树
当前节点符合二叉搜索树
右节点是二叉搜索树
策略二:剪枝
当全局变量prev,遍历到19的时候就已经不是二叉搜索树了,就不需要再往下遍历了。
4.2 代码
策略一:
/*** 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
{long prev=LONG_MIN;
public:bool isValidBST(TreeNode* root) {if(root==nullptr)return true;bool left=isValidBST(root->left);bool cur=false;if(root->val>prev){cur=true; }prev=root->val;bool right=isValidBST(root->right);return left&&right&&cur;}};
策略二:
/*** 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
{long prev=LONG_MIN;
public:bool isValidBST(TreeNode* root) {if(root==nullptr)return true;bool left=isValidBST(root->left);if(left==false)return false;bool cur=false;if(root->val>prev){cur=true; }prev=root->val;bool right=isValidBST(root->right);return left&&right&&cur;}};
5 230. 二叉搜索树中第 K 小的元素
5.1 分析
二叉搜索树的中序遍历的结果,是一个有序的序列用这个性质来做这道题。
与上面那题类似。
这题用两个全局变量和中序遍历。
一个全局变量c用来计数,另一个ret用来记录遍历节点对应的值。
每遍历一次c就减减,当c等于0时候的ret值就是最终需要的值。
当找到最终结果时候,此时c=0后面就不用遍历了。
5.2 代码
/*** 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 {int count;int ret;
public:int kthSmallest(TreeNode* root, int k) {count=k;dfs(root);return ret; }void dfs(TreeNode* root){if(root==nullptr||count==0)return;dfs(root->left);count--;if(count==0)ret=root->val;dfs(root->right);}
};
6 257. 二叉树的所有路径
6.1 分析
全局变量
回溯->恢复现场
一道题出现了回溯才能想到恢复现场。
题目要求以箭头形式返回结果
算法原理:
根节点开始向下搜索,遇到一个叶子结点,存一下这个路径,存到数组中返回。
用两个全局变量,一个string[] ret表示字符串数组保存最终结果,遇到一个叶子结点路径就放进去。另一个string path用来记录路径,遇到不是叶子结点就在后面加上这个值,遇到叶子结点后,把这个path加到ret里面。
但要考虑path的回溯问题:
为了防止回溯多加上叶子结点的值,就得恢复现场,再回溯时候就得剪掉上一个路径的叶子结点。
全局变量恢复现场不容易,就不用全局的string path。
如果把path设置成函数头参数,就不用恢复现场,函数的特性就会帮助恢复现场。
函数头:
void dfs(root,path)
当遍历时候,就会重新创建一个path,而上面的path也在:
函数体
当遇到叶子结点时:就把path加到ret里面
不是叶子结点就继续遍历
递归出口:
当左子树为空的时候,就不需要遍历它左子树,把它左子树就剪掉。
不想剪枝,就直接root为空返回
6.2 代码
/*** 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<string> ret;vector<string> binaryTreePaths(TreeNode* root) {string path;if(root==nullptr)return ret;dfs(root,path);return ret;}void dfs(TreeNode* root,string path){path+=to_string(root->val);if(root->left==nullptr&&root->right==nullptr){ret.push_back(path);return;}path+="->";if(root->left)dfs(root->left,path);if(root->right)dfs(root->right,path);}
};
有问题请指出,大家一起进步!!!
相关文章:
【递归、搜索和回溯】二叉树中的深搜
个人主页 : zxctscl 专栏 【C】、 【C语言】、 【Linux】、 【数据结构】、 【算法】 如有转载请先通知 文章目录 前言1 2331. 计算布尔二叉树的值1.1 分析1.2 代码 2 129. 求根节点到叶节点数字之和2.1 分析2.2 代码 3 814. 二叉树剪枝3.1 分析3.2 代码 4 98. 验证…...
通俗的理解MFC消息机制
1. 消息是什么? 想象你家的门铃响了(比如有人按门铃、敲门、或者有快递),这些都是“消息”。 在 MFC 中,消息就是系统或用户触发的各种事件,比如鼠标点击(WM_LBUTTONDOWN)、键盘输入…...
Windows CMD通过adb检查触摸屏Linux驱动是否被编译
检查 CONFIG_TOUCHSCREEN_GT9XX 是否启用,检查内核是否编译了Goodix GT9XX系列触摸屏的驱动支持 Windows CMD.exe输入: adb shell “zcat /proc/config.gz | grep CONFIG_TOUCHSCREEN_GT9XX” 如果返回CONFIG_TOUCHSCREEN_GT9XXy,表示驱动已编…...
Java并发编程-锁(八)
文章目录 Condition的使用和实现使用add(T t) 实现等待队列await()signal()signalAll() 总结 Condition的使用和实现 我们知道,任意一个Java Object,都拥有一组监视器方法,主要包括wait()、 wait(long timeout)、notify()以及notifyAll()方法…...
idea如何快速生成测试类
点击 code -> generate -> Test...
FPGA笔试题review
今天翻网盘上的旧资料,找到了一套20年9月份在武汉某芯片公司食堂做的笔试题(我在做笔试题,旁边的人在嗦酸辣粉,也算是记忆犹新),借着这套题目,正好也可以捡一捡关于FPGA的基础知识点,算是温故而知新。答案更新中 1、名词解释 (1)FPGA、ASIC (2)CLB、LUT (3)时…...
[C++类和对象]构造函数和析构函数
类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗? 并不是,任何类在什么都不写时,编译器会自动生成以下6 个默认成员函数。 默认成员函数:用户没有显式实现,编译器会…...
Java【网络原理】(5)深入浅出HTTPS:状态码与SSL/TLS加密全解析
目录 1.前言 2.正文 2.1状态码 2.2HTTP与HTTPS的关系 2.3SSL协议 2.3.1对称加密 2.3.2非对称加密 2.3.3中间人攻击 2.3.4校验机制 2.3.4.1证书 2.3.4.2数字签名 1. 数字签名的生成过程 2. 数字签名的验证过程 2.4TLS协议(握手过程) 3.小结…...
《全球短剧正版授权通道,助力平台出海与流量变现》
正版短剧片源授权,全方位赋能您的内容运营 短剧作为短视频领域的一种重要形式,凭借其紧凑的剧情、鲜明的角色和引人入胜的叙事方式,赢得了广大观众的喜爱。 然而,在短剧市场蓬勃发展的同时,版权问题也日益凸显。为了保…...
17.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--ELK
在微服务中,日志是非常重要的组成部分。它不仅可以帮助我们排查问题,还可以帮助我们分析系统的性能和使用情况。ELK(Elasticsearch、Logstash、Kibana)是一个强大的日志分析工具,可以帮助我们收集、存储和分析日志数据…...
Linux系统管理与编程16:PXE自动化安装部署centos7.9操作系统
兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 0.准备 1)防火墙和SELinux systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/^SELINUX.*/SELINUXdisabled/ /etc/selinux/config (很不好的…...
DAMA第10章深度解析:参考数据与主数据管理的核心要义与实践指南
引言 在数字化转型的浪潮中,数据已成为企业的核心资产。然而,数据孤岛、冗余和不一致问题严重制约了数据价值的释放。DAMA(数据管理协会)提出的参考数据(Reference Data)与主数据(Master Data&…...
Python+OpenCV打造AR/VR基础框架:从原理到实战的全链路解析
引言:重新定义数字与现实的边界 在元宇宙概念持续升温的当下,AR(增强现实)与VR(虚拟现实)技术正成为连接物理世界与数字世界的桥梁。Python凭借其丰富的计算机视觉生态(尤其是OpenCV库…...
PaddleOCR本地部署
构建TestPaddle目录: TestPaddle/ └── PaddleOCR ├── ocr_server.py ├── ch_PP-OCRv4_det_infer.tar ├── ch_PP-OCRv4_rec_infer.tar └── 001.jpg1、安装PaddleOCR 安装 PaddleOCR git clone https://github.com/PaddlePaddle/PaddleOCR.git cd …...
Spring事务融入(REQUIRED)具体实现步骤解析
Spring事务融入(REQUIRED传播行为)是Spring事务管理中最核心的机制,下面我将深入剖析其具体实现步骤和关键代码逻辑。 1. 整体流程概览 事务融入(REQUIRED)的核心逻辑是: 检查当前线程是否存在事务 存在则融入(加入)该事务 不存在则创建新事务 2. …...
Java 开发者 Linux 学习指南
目录 一、引言:为什么 Java 开发者必须掌握 Linux 二、Linux 基础:核心概念与常用命令 (一)文件系统与目录结构 (二)权限体系与用户管理 (三)进程管理与监控 三、在 Linux 上安…...
2025年PMP 学习七 -第5章 项目范围管理 (5.4,5.5,5.6 )
2025年PMP 学习七 -第5章 项目范围管理 5.4 创建 WBS 1.定义与作用 定义把项目可交付成果和项目工作分解成较小的,更易于管理的组件作用对所要交付的内容提供一个结构化的视图 2.输入,输出,工具与技术 3. 创建WBS的依据(输入&…...
【LangChain全景指南】构建下一代AI应用的开发框架
目录 🌟 前言🏗️ 技术背景与价值🚧 当前技术痛点🛠️ 解决方案概述👥 目标读者说明 🔍 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🧩 关键技术模块说明⚖️ 技术选…...
Linux系统:虚拟文件系统与文件缓冲区(语言级内核级)
本节重点 初步理解一切皆文件理解文件缓冲区的分类用户级文件缓冲区与内核级文件缓冲区用户级文件缓冲区的刷新机制两级缓冲区的分层协作 一、虚拟文件系统 1.1 理解“一切皆文件” 我们都知道操作系统访问不同的外部设备(显示器、磁盘、键盘、鼠标、网卡&#…...
Linux进程间信号
目录 信号入门 生活角度中的信号 技术应用角度的信号 信号的发送与记录 信号处理常见方式概述 产生信号 通过终端按键产生 通过系统函数向进程发信号 由软件条件产生信号 由硬件异常产生信号 阻塞信号 信号其他相关常见概念 在内核中的表示 sigset_t 信号集操作…...
数据分析2
五、文件 CSV Comma-Separated Value,逗号分割值。CSV文件以纯文本形式存储表格数据(数字和文本)。 CSV记录间以某种换行符分隔,每条记录由字段组成,字段间以其他字符或字符串分割,最常用逗号或制表符。…...
每日一题:两个仓库的最低配送费用问题
文章目录 两个仓库的最低配送费用问题一、问题描述二、解题思路(一)初始假设(二)差值定义(三)选择最优(四)计算答案 三、代码实现四、代码分析(一)输入处理&a…...
SemanticSplitterNodeParser 和 Sentence-BERT 的区别和联系是什么
这涉及到文本切分(chunking)与语义向量(embedding)之间的关系。我们来详细对比: ✅ 1. SemanticSplitterNodeParser 是什么? SemanticSplitterNodeParser 是 llama-index 提供的一种 语义感知的文本切分工…...
Fabric系列 - SoftHSM 软件模拟HSM
在 fabric-ca-server 上使用软件模拟的 HSM(密码卡) 功能 安装 SoftHSMv2 教程 SoftHSMv2 默认的配置文件 /etc/softhsm2.conf默认的token目录 /var/lib/softhsm/tokens/ 初始化和启动fabric-ca-server,需要设置一个管理员用户的名称和密码 初始化令牌 # 初始…...
简易图片编辑工具,支持抠图和替换背景
软件介绍 Photo Retouch是一款由微软官方商店推出的免费图片处理软件,具有抠图、换背景、修复等功能,操作便捷且效率极高,非常值得尝试。 功能详解 这款软件提供五大功能,包括删除物体、快速修复、一键抠图、背景调整和裁剪…...
CountDownLatch 并发编程中的同步利器
CountDownLatch 并发编程中的同步利器 文章目录 CountDownLatch 并发编程中的同步利器一、CountDownLatch 基础概念1.1 什么是 CountDownLatch?1.2 CountDownLatch 的核心方法1.3 基本使用示例 二、CountDownLatch 实战应用2.1 应用场景一:并行任务协调2…...
C++GO语言微服务之用户信息处理
目录 01 01-微服务实现用户注册-微服务端-上 02 02-微服务实现用户注册-微服务端-下 03 03-微服务实现用户注册-web端 04 04-微服务实现用户注册-web端-流程小结 05 05-获取地域信息-读MySQL写Redis入 06 06-获取地域信息-先查redis-没有读MySQL写入 01 07-Cookie简介 0…...
互联网大厂Java求职面试实战:Spring Boot微服务与数据库优化详解
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通 😁 2. 毕业设计专栏,毕业季咱们不慌忙,几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…...
Linux基本指令(一)
目录 基本指令 pwd指令 cd指令 cd ..编辑 cd ~ ls指令 ls -l ls -a ls -d touch指令 mkdir指令 rmdir指令 && rm 指令 操作系统是什么呢?一个好的操作系统要具备什么条件呢? 简单来说,操作系统是是一款做软硬件管理的软…...
Java—— 集合 List
List集合的特点 有序:存和取的元素顺序一致 有索引:可以通过索引操作元素 可重复:存储的元素可以重复 List集合的方法 Collection的方法List都继承了,可以使用Collection中的方法 此外,List集合因为有索引,…...
使用谱聚类将相似度矩阵分为2类
使用谱聚类将相似度矩阵分为2类的步骤如下: 构建相似度矩阵:提供的1717矩阵已满足对称性且对角线为1。 计算度矩阵:对每一行求和得到各节点的度,形成对角矩阵。 计算归一化拉普拉斯矩阵:采用对称归一化形式 LsymI−D…...
【Bootstrap V4系列】学习入门教程之 组件-表单(Forms)高级用法(二)
Bootstrap V4系列 学习入门教程之 组件-表单(Forms)高级用法(二) 表单(Forms)高级用法(二)一、Help text 帮助文本二、Disabled forms 禁用表单三、Validation 验证3.1 How it works…...
【许可证】Open Source Licenses
长期更新 扩展:shield.io装饰 开源许可证(Open Source Licenses)有很多种,每种都有不同的授权和限制,适用于不同目的。 默认的ISC🟰MIT License是否可商用是否要求开源衍生项目是否必须署名是否有专利授权…...
RT-Thread 深入系列 Part 7:RT-Thread vs 其他 RTOS 对比与选型指南
摘要 本文对比 RT-Thread、FreeRTOS、Zephyr、uC/OS、Mbed OS 等主流嵌入式操作系统,从功能特性、社区生态、学习成本、商业支持、安全性和典型应用场景六个维度进行详尽对比,并给出不同项目类型下的选型建议,帮助你为下一个嵌入式项目做出最合适的决策。 目录 功能特性对比…...
每天五分钟机器学习:KTT条件
本文重点 在前面的课程中,我们学习了拉格朗日乘数法求解等式约束下函数极值,如果约束不是等式而是不等式呢?此时就需要KTT条件出手了,KTT条件是拉格朗日乘数法的推广。KTT条件不仅统一了等式约束与不等式约束的优化问题求解范式,KTT条件给出了这类问题取得极值的一阶必要…...
金融学知识笔记
金融学知识笔记 一、引言 金融学它结合了数学、概率论、统计学、经济学和计算机科学等多学科的知识,用于解决金融领域中的各种问题,如金融衍生品定价、投资组合优化、风险管理和固定收益证券分析等。通过对金融学的学习,我们可以更好地理解…...
Web3 实战项目项目部署到 GitHub 和上线预览的完整指南
目录 🚀 一、部署到 GitHub ✅ 前置准备 🧱 部署步骤: 1. 创建一个 GitHub 仓库 2. 上传项目文件 方法一:使用 Git 命令行 方法二:直接上传 🌐 二、通过 GitHub Pages 免费上线 DApp(前端…...
嵌入式开发学习(阶段二 C语言基础)
C语言:第05天笔记 内容提要 分支结构 条件判断用if语句实现分支结构用switch语句实现分支结构 分支结构 条件判断 条件判断:根据某个条件成立与否,决定是否执行指定的操作。 条件判断的结果是逻辑值,也就是布尔类型值&#…...
【沉浸式求职学习day35】【Tomcat安装、配置】【Http简述】
😩😩😩,真的每天忙死,感觉自己精神上压力真的很大,希望我的努力能够激励到你们~ 沉浸式求职学习 Tomcat1.安装2.Tomcat启动和配置3.配置高难度面试题 4.发布一个web网站5.Http1.什么是HTTP2.两个时代3.Htt…...
基于大模型的新型隐球菌脑膜炎智能诊疗全流程系统设计与实现的技术方案文档
目录 一、术前风险预测系统1. 多模态融合模型架构2. 风险预测流程图(Mermaid)二、麻醉剂量预测系统1. 靶控输注(TCI)模型2. 麻醉方案优化流程图(Mermaid)三、术后并发症预测模型1. 时序预测模型(LSTM)2. 并发症预测流程图(Mermaid)四、健康教育管理模块1. 移动健康(…...
如何实现PLC远程编程
1. 什么是PLC编程 PLC编程是指为可编程逻辑控制器(Programmable Logic Controller,PLC)编写控制逻辑的过程。PLC是一种工业自动化控制设备,广泛应用于制造业、机械控制、流水线、电力系统等领域,用于替代传统的继电器…...
Go基于plugin的热更新初体验
背景 对于一个部署在生产环境的项目来说,我们希望当代码出现bug的时候,可以不用重启进程而达到动态修改代码的目的—— 这就是代码热部署! 使用java做游戏服务器,最大的好处是,当代码出现bug,可以直接热…...
【STM32 学习笔记】I2C通信协议
注:通信协议的设计背景 3:00~10:13 I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩展性强, 不需要USART、CAN等通讯协议的外部收发设备,现在被广…...
RAG与语义搜索:让大模型成为测试工程师的智能助手
引言 AI大模型风头正劲,自动生成和理解文本的能力让无数行业焕发新生。测试工程师也不例外——谁不想让AI自动“看懂需求、理解接口、生成用例”?然而,很多人发现:直接丢问题给大模型,答案貌似“懂行”,细…...
Nakama:让游戏与应用更具互动性和即时性
在现代游戏和应用程序开发中,实现社交互动和实时功能已成为用户体验的核心需求。为满足这种需求,许多开发者正转向分布式服务器技术,在这些技术中,Nakama 构建起了一座桥梁。Nakama 是一个开源的分布式服务器,专门为社…...
[Spring AOP 7] 动态通知调用
动态通知调用 本笔记基于黑马程序员 Spring高级源码解读 更美观清晰的版本在:Github 注意:阅读本章内容之前,建议先熟悉静态通知调用的内容 在静态通知调用一节中,我们还有一个悬而未决的问题。 我们谈到了调用链MethodInvocation…...
Redis 集群
集群基本介绍 广义的集群,只要是多个机器构成了分布式系统,都可以称为是一个“集群”(主从模式,哨兵模式) 狭义的集群,Redis 提供的集群模式,在这个模式下主要解决的是存储空间不足的问题&…...
【Redis】基础命令数据结构
文章目录 基础命令keysexistsdelexpirettltype 数据结构和内部编码 在介绍数据类型前先介绍一下 Redis 的基础命令,方便理解 基础命令 keys 返回所有满足样式(pattern)的 key keys pattern 当前有如下 key PS:实际开发环境和生…...
C++(6):逻辑运算符
目录 1. 代码示例 示例 1:基础用法 示例 2:条件判断 2. 短路求值(Short-Circuit Evaluation) 代码示例 3. 实际应用场景 场景 1:输入合法性验证 场景 2:游戏状态判断 4. 注意事项 逻辑运算符用于组…...
项目管理从专家到小白
敏捷开发 Scrum 符合敏捷开发原则的一种典型且在全球使用最为广泛的框架。 三个角色 产品负责人Product Ower:专注于了解业务、客户和市场要求,然后相应地确定工程团队需要完成的工作的优先顺序。 敏捷教练Scrum Master:确保 Scrum 流程顺…...