当前位置: 首页 > 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 的…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...