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

数据结构:二叉树—面试题(二)

1、二叉树的最近公共祖先

习题链接https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/

描述:

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

解题思路

对于这道题我们有两种思路来解决这个问题

思路一:

首先,我们要去找到p,q这两个结点,我们从根节点开始找,如果根结点属于p或者q,我们就直接返回,此时的根结点就是p,q的最近公共祖先。

但我们的根节点不是p,q我们就去根的左子树和右子树去找,如果根的左右两个结点还不是,我们就继续向下找,因此我们需要利用递归实现。

到最后了我们还是没有找到,我们就返回null,如果找到了就返回p或者q的结点,当我们得到了p和q这俩个结点后,还要得到最近的公共祖先,如果这两个返回值不为空,就返回root(此时递归回来两个结点的父节点),如果一个为空一个不为空就返回不为空的结点。

思路二:

首先,我们还是从根结点开始找,如果根结点属于p或者q,我们就直接返回,此时的根结点就是p,q的最近公共祖先。

但如果我们的根节点不是,我们就创建两个栈,将从根节点到p的结点放到stack1这个栈中,将从根节点到q的结点放到stack2中。

首先我们从根节点开始放,如果不是就走左子树,走完左子树再走右子树,走一个结点就入栈一个,如果在递归往下走的过程中,如果此时是左边为空,就返回false,然后就向右边走,如果右边也为空就弹出这个结点,并返回false,如果最后, 如果左右两边找到了就返回true.

最后我们得到的两个栈,存放的就是从根节点到p,q的所有结点,此时我们计算栈的长度,求出差值,如果一个栈长,就让这个栈弹出差值个元素让这两个栈是相同的长度,然后让这两个栈一起走,如果在走的过程中他们相遇了此时相遇的值就是我们的p,q最近公共祖先。

完整代码 

思路一:

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root == null){return null;}if(root == p || root == q){return root;}TreeNode leftNode = lowestCommonAncestor(root.left,p,q);TreeNode rightNode = lowestCommonAncestor(root.right,p,q);if(leftNode != null && rightNode != null){return root;}else if(leftNode != null){return leftNode;}else if(rightNode != null){return rightNode;}return null;}
}

思路二: 

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root == null){return null;}if(root == p || root == q){return root;}Stack<TreeNode> stack1 = new Stack<>();Stack<TreeNode> stack2 = new Stack<>();TreeNodeStack(root,p,stack1);TreeNodeStack(root,q,stack2);int size = stack1.size() - stack2.size();if(size < 0){size = Math.abs(size);while(size != 0){stack2.pop();size--;}}else{while(size != 0){stack1.pop();size--;}}while(!stack1.isEmpty() && !stack2.isEmpty()){if(stack1.peek() != stack2.peek()){stack1.pop();stack2.pop();}else{return stack1.pop();}}return null;}public boolean TreeNodeStack(TreeNode root,TreeNode node,Stack<TreeNode> stack){if(root == null){return false;}stack.add(root);if(root == node){return true;}boolean flg = TreeNodeStack(root.left,node,stack);if(flg){return true;}flg = TreeNodeStack(root.right,node,stack);if(flg){return true;}stack.pop();return false;} 
}

2、从前序与中序遍历序列构建二叉树

习题链接https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/

描述:

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

解题思路

他要我们根据前序和中序创建二叉树,首先,我们要创建一个变量preorderindex,作为一个引用指向前序遍历,并在设立两个变量inbegin和inend代表中序遍历的第一个和最后一个位置。

我们知道,我们前序遍历的第一个结点就是我们的根节点,此时我们在去中序遍历中找这个节点,此时在中序遍历中这个结点的左边就是我们的左子树的所有结点,右边是我们右子树的所有结点。

而我们左子树的第一个结点就是我们前序遍历的第二个结点,而我们左子树要在中序遍历找的范围就是我们的最左边inbegin和我们的根节点的位置减一,而我们右子树要在中序遍历找的范围就是我们的最右inend和我们的根节点的位置加一,每创建一个结点就让preorderindex++

最后一点我们什么时候什么时候停止创建,就是我们中序遍历中的inbegin和inend相遇了或者inbegin超过inend。

完整代码 

class Solution {public int preorderindex = 0;public TreeNode buildTree(int[] preorder, int[] inorder) {return buildTreeChild(preorder,inorder,0,inorder.length-1);}public TreeNode buildTreeChild(int[] preorder, int[] inorder,int inbegin,int inend) {if(inbegin > inend){return null;}TreeNode root = new TreeNode(preorder[preorderindex]);int rootindex = findindex(inorder,inbegin,inend,preorder[preorderindex]);preorderindex++;root.left = buildTreeChild(preorder,inorder,inbegin,rootindex-1);root.right = buildTreeChild(preorder,inorder,rootindex+1,inend);return root;}public int findindex(int[] inorder,int inbegin,int inend,int key){for(int i = inbegin ;i<=inend;i++){if(inorder[i] == key){return i;}}return -1;}
}

3、从中序与后序遍历序列构建二叉树

习题链接https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/

描述:

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

解题思路

这道题和我们上面的方式是一样的,只是我们找根节点是从后序遍历的最后一个结点开始找,并且我们要先建立右子树在建立左子树,因为我们后序遍历的方式是左右根,我们根是跟着右树相连的。

完整代码 

class Solution {public int postorderindex =0;public TreeNode buildTree(int[] inorder, int[] postorder) {postorderindex =  postorder.length-1;return buildTreeChild(inorder,postorder,0,inorder.length-1);}public TreeNode buildTreeChild(int[] inorder, int[] postorder,int inbegin ,int inend) {if(inbegin > inend){return null;}TreeNode root = new TreeNode(postorder[postorderindex]);int rootindex = findindex(inorder,inbegin,inend,postorder[postorderindex]);postorderindex--;root.right = buildTreeChild(inorder,postorder,rootindex+1,inend);root.left = buildTreeChild(inorder,postorder,inbegin,rootindex-1);return root;}public int findindex(int[] inorder,int inbegin,int inend,int key){for(int i = inbegin;i<= inend;i++){if(inorder[i] == key){return i;}}return -1;}
}

4、根据二叉树创建字符串

习题链接https://leetcode.cn/problems/construct-string-from-binary-tree/description/https://leetcode.cn/problems/construct-string-from-binary-tree/description/

描述:

给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。

空节点使用一对空括号对 "()" 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

解题思路

根据这道题的示例,其实我们能发现他的创建规则。

首先我们先将根节点传入字符串中,然后如果左子树不为空就不断向下走左子树,每遇到一个左节点不为空的结点就先在字符串中添加一个左括号“(”然后再利用递归添加这个结点的值,并不断的往下走如果我们的左节点为空了,但是右节点不为空就添加一个“()”,如果左右都为空就直接返回,并利用递归添加一个“)”

最后我们的左子树的结点已经全部添加到字符串上了,我们再去添加右子树,如果右子树不为空,我们还是去添加一个“(”,然后再去添加右子树的结点,如果最后最后右子树为空了,并且能走到右子树也代表左子树为空,此时就直接返回并利用递归添加一个“)”

完整代码 

class Solution {public String tree2str(TreeNode root) {StringBuilder stringBuilder = new StringBuilder();tree2strChild(root,stringBuilder);return stringBuilder.toString();}public void tree2strChild(TreeNode root,StringBuilder stringBuilder) {if(root == null){return ;}stringBuilder.append(root.val);if(root.left != null){stringBuilder.append("(");tree2strChild(root.left,stringBuilder);stringBuilder.append(")");}else{if(root.right != null){stringBuilder.append("()");}else{return ;}}if(root.right != null){stringBuilder.append("(");tree2strChild(root.right,stringBuilder);stringBuilder.append(")");}else{return;}}
}

5、二叉树的前序遍历

习题链接https://leetcode.cn/problems/binary-tree-preorder-traversal/description/https://leetcode.cn/problems/binary-tree-preorder-traversal/description/

描述:

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

解题思路

根据题意就是要得到我们二叉树的前序遍历,首先我们创建一个链表来接收前序遍历的值,如果二叉树为空直接返回,不为空就创建一个栈,和两个节点,cur指向root,tap指向空。

然后我们要利用循环得到前序遍历的结果,我们知道前序遍历的顺序是:根左右,因此我们要先去左树,我们从根结点开始入栈,每入一个节点就在链表中添加一个结点值,并往下向左结点走,如果此时我们的左节点为空了,我们就弹出此时的栈顶元素,即此时左节点的根节点,给tap,在让cur指向tap的右结点,如果此时的右结点不为空,就放入到栈和链表中,并继续走左节点,为空就重复上面的操作,但如果此时的右节点为空,就代表新的cur为空,但是此时栈不为空,我们还是进入循环,而这样的操作就返回到了我们的上一层。于是在不断循环下就得到了我们的前序遍历

完整代码 

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> ans = new LinkedList<>();if(root == null){return ans;}Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;TreeNode tap = null;while(cur != null || !stack.isEmpty()){while(cur != null){stack.push(cur);ans.add(cur.val);cur = cur.left;}tap = stack.pop();cur = tap.right;}return ans;}
}

6、二叉树的中序遍历

习题链接https://leetcode.cn/problems/binary-tree-inorder-traversal/description/https://leetcode.cn/problems/binary-tree-inorder-traversal/description/

描述:

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

解题思路

他的思路跟上面是一样的,此时他是要我们得到是中序遍历的结果,而中遍历的顺序是:左根右,因此我们放入栈的时机是左子树走完了才能放入到链表中,因此我们只需要将上面放入链表的代码,放到左子树为空的时候,并且我们要存放的第一个元素应该是我们此时左子树的最后一个结点,所以我们要放入的是此时的栈顶元素

完整代码 

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> ans = new LinkedList<>();if(root == null){return ans;}Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;TreeNode tap = null;while(cur != null || !stack.isEmpty()){while(cur != null){stack.push(cur);cur = cur.left;}tap = stack.pop();ans.add(tap.val);cur = tap.right;}return ans;}
}

7、二叉树的后序遍历

习题链接https://leetcode.cn/problems/binary-tree-postorder-traversal/description/https://leetcode.cn/problems/binary-tree-postorder-traversal/description/

描述:

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。

解题思路

他的思路跟上面还是一样的,此时他是要我们得到是后序遍历的结果,而后遍历的顺序是:左右根,因此我们放入栈的时机是左子树走完了并且右子树也走完才能放入到链表中。

因此我们需要在我们的左子树为空时利用if语句判断,他的右子树是否为空,如果为空就出栈,并将原来的栈顶元素放入链表中,如果不为空就让cur等于此时栈顶元素的右边结点(注意:这里tap的赋值,不能用pop,而是用peek,因为,如果此时左子树为空的,但是右子树不为空,我们还需要继续往栈中入栈,因为后序遍历的顺序根左右根,我们需要将左子树和右子树走完才能打印根节点)

但是我们需要注意,在这样的情况下我们会陷入死循环,不断打印右子树最后的值,我们先来看下面

此时cur为空,tap等于结点7,tap.right 为空,此时我们就出栈并在链表中放入结点7,当时我们走完后栈不为空,再次进入循环此时cur为空,tap就等于结点5,但是结点5的右边为结点7不为空,cur 此时就等于结点7,然后cur此时就不为空,结点7,再次入栈,在这样的情况下我们发现我们会不停的打印结点7,陷入了死循环

因此这时我们需要定义一个变量prev,让他存储弹出的结点,并在if判断中进行判断,如果此时的tap右边不为空但是他的右边等于我们弹出的元素我们就让他进入循环弹出此时栈顶元素,并放入链表中

例如:根据上面的图弹出7后,再次进入循环tap=5,此时tap.right为7不为空,但是tap.right为7等于我们的prev即弹出过的元素,就不往下走直接进入循环弹出结点5,这样就防止了死循环

完整代码 

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> ans = new LinkedList<>();if(root == null){return ans;}Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;TreeNode tap = null;TreeNode prev = null;while(cur != null || !stack.isEmpty()){while(cur != null){stack.push(cur);cur = cur.left;}tap = stack.peek();if(tap.right == null || tap.right == prev){stack.pop();ans.add(tap.val);prev = tap;}else{cur = tap.right;}} return ans;}
}

好了,今天的分享就到这里了,还请大家多多关注,我们下一篇见! 

相关文章:

数据结构:二叉树—面试题(二)

1、二叉树的最近公共祖先 习题链接https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/ 描述&#xff1a; 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点…...

OFD、PDF 电子签章系统处理流程

在C#中实现电子签章系统的处理流程&#xff0c;可以参考以下步骤和技术实现&#xff1a; 1. 电子签章系统的基本流程 电子签章系统的核心流程包括以下几个步骤&#xff1a; 密钥生成&#xff1a;生成公钥和私钥对&#xff0c;私钥由签章人保管&#xff0c;公钥用于验证签名。…...

分布式微服务系统简述

distributed microservice 分布式与微服务的定义及关系&#xff1b;分布式微服务架构里的各组件&#xff0c;如&#xff1a;配置中心、服务注册/发现、服务网关、负载均衡器、限流降级、断路器、服务调用、分布式事务等&#xff1b;spring cloud 介绍及实现案例&#xff0c;如…...

【Linux】列出所有连接的 WiFi 网络的密码

【Linux】列出所有连接的 WiFi 网络的密码 终端输入 sudo grep psk /etc/NetworkManager/system-connections/*会列出所有连接过 Wifi 的信息&#xff0c;格式类似 /etc/NetworkManager/system-connections/AAAAA.nmconnection:pskBBBBBAAAAA 是 SSID&#xff0c;BBBBB 是对…...

电脑无法开机,重装系统后没有驱动且驱动安装失败

电脑无法开机&#xff0c;重装系统后没有驱动且驱动安装失败 前几天电脑突然坏了&#xff0c;电脑卡住后&#xff0c;强制关机&#xff0c;再开机后开机马上就关机。尝试无数次开机后失败&#xff0c;进入BIOS界面&#xff0c;发现已经没有Windows系统了。重新安装系统后&…...

基于SpringBoot格式化实体的时间类型以及静态注入依赖

一. 场景描述 在进行前后端交互时&#xff0c;发现实体的LocalDateTime返回的格式是这样的&#xff1a; 这不符合我们日常习惯的格式 “年-月-日 时:分:秒”&#xff0c;于是上网学习了前辈 励碼的文章SSM项目中LocalDateTime格式化最佳实践_localdatetime 格式化-CSDN博客解决…...

技术总结:FPGA基于GTX+RIFFA架构实现多功能SDI视频转PCIE采集卡设计方案

目录 1、前言工程概述免责声明 3、详细设计方案设计框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGBFDMA图像缓存RIFFA用户数据控制RIFFA架构详解Xilinx 7 Series Integrated Block for PCI ExpressRIFFA驱动及其安装QT上位机HDMI输出RGB转BT…...

Flink读写Kafka(Table API)

前面(Flink读写Kafka(DataStream API)_flink kafka scram-CSDN博客)我们已经讲解了使用DataStream API来读取Kafka,在这里继续讲解下使用Table API来读取Kafka,和前面一样也是引入相同的依赖即可。 <dependency> <groupId>org.apache.flink</groupId&…...

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.2 ndarray解剖课:多维数组的底层实现

1.2 《ndarray解剖课&#xff1a;多维数组的底层实现》 内容介绍 NumPy 的 ndarray 是其核心数据结构&#xff0c;用于高效处理多维数组。在这篇文章中&#xff0c;我们将深入解析 ndarray 的底层实现&#xff0c;探讨其内存结构、维度、数据类型、步长等关键概念&#xff0c…...

冯诺依曼架构和哈佛架构的主要区别?

冯诺依曼架构&#xff08;Von Neumann Architecture&#xff09;和哈佛架构&#xff08;Harvard Architecture&#xff09;是两种计算机体系结构&#xff0c;它们在存储器组织、指令处理和数据存取等方面有明显的不同。以下是它们的主要区别&#xff1a; 1.存储器结构 冯诺依曼…...

Gurobi基础语法之字典

Python中的字典&#xff1a;dict 我们先来介绍一下Python语法中的 dict 类型, 字典中可以通过任意键值来对数据进行映射&#xff0c;任何无法修改的python对象都可以当作键值来使用&#xff0c;这些无法修改的Python对象包括&#xff1a;整数(比如&#xff1a;1)&#xff0c;浮…...

ceph新增节点,OSD设备,标签管理(二)

一、访问客户端集群方式 方式一: 使用cephadm shell交互式配置 [rootceph141 ~]# cephadm shell # 注意&#xff0c;此命令会启动一个新的容器&#xff0c;运行玩后会退出&#xff01; Inferring fsid c153209c-d8a0-11ef-a0ed-bdb84668ed01 Inferring config /var/lib/ce…...

利用metaGPT多智能体框架实现智能体-2

1.一些帮助理解的概念 智能体 在MetaGPT看来&#xff0c;可以将智能体想象成环境中的数字人&#xff0c;其中 智能体 大语言模型&#xff08;LLM&#xff09; 观察 思考 行动 记忆 这个公式概括了智能体的功能本质。为了理解每个组成部分&#xff0c;让我们将其与人类进…...

Hadoop 与 Spark:大数据处理的比较

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…...

Django 日志配置实战指南

日志是 Django 项目中不可或缺的一部分,它帮助我们记录应用程序的运行状态、调试信息、错误信息等。通过合理配置日志,我们可以更好地监控和调试应用程序。本文将详细介绍如何在 Django 项目中实现日志文件分割、日志级别控制以及多环境日志配置,并结合最佳实践和代码示例,…...

传输层协议TCP与UDP:深入解析与对比

传输层协议TCP与UDP&#xff1a;深入解析与对比 目录 传输层协议TCP与UDP&#xff1a;深入解析与对比引言1. 传输层协议概述2. TCP协议详解2.1 TCP的特点2.2 TCP的三次握手与四次挥手三次握手四次挥手 2.3 TCP的流量控制与拥塞控制2.4 TCP的可靠性机制 3. UDP协议详解3.1 UDP的…...

doris:JSON导入数据

本文介绍如何在 Doris 中导入 JSON 格式的数据文件。Doris 支持导入标准 JSON 格式数据&#xff0c;通过配置相关参数&#xff0c;可以灵活地处理不同的 JSON 数据结构&#xff0c;并支持从 JSON 数据中抽取字段、处理嵌套结构等场景。 导入方式​ 以下导入方式支持 JSON 格式…...

Ubuntu18.04 搭建DHCP服务器

在Ubuntu系统中&#xff0c;DHCP&#xff08;动态主机配置协议&#xff09;服务通常由isc-dhcp-server软件包提供。要配置和使用DHCP服务&#xff0c;你可以按照以下步骤操作&#xff1a; 1. 安装DHCP服务器 首先&#xff0c;你需要安装isc-dhcp-server。打开终端并输入以下命…...

Spring Boot 邂逅Netty:构建高性能网络应用的奇妙之旅

一、引言 在当今数字化时代&#xff0c;构建高效、可靠的网络应用是开发者面临的重要挑战。Spring Boot 作为一款强大的 Java 开发框架&#xff0c;以其快速开发、简洁配置和丰富的生态支持&#xff0c;深受广大开发者喜爱。而 Netty 作为高性能、异步的网络通信框架&#xff…...

【云安全】云原生-Docker(五)容器逃逸之漏洞利用

漏洞利用逃逸 通过漏洞利用实现逃逸&#xff0c;主要分为以下两种方式&#xff1a; 1、操作系统层面的内核漏洞 这是利用宿主机操作系统内核中的安全漏洞&#xff0c;直接突破容器的隔离机制&#xff0c;获得宿主机的权限。 攻击原理&#xff1a;容器本质上是通过 Linux 的…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

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

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

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...