数据结构之初始二叉树(3)
找往期文章包括但不限于本期文章中不懂的知识点:
个人主页:我要学编程(ಥ_ಥ)-CSDN博客
所属专栏:数据结构(Java版)
二叉树的基本操作
通过上篇文章的学习,我们简单的了解了二叉树的相关操作。接下来就是有关二叉树的经典题型练习。
递归相关的题目都有一个套路:例如:确定一个节点要做的事情,其余的套框架,递归就行了。下面我们就来细细品味。
目录
100. 相同的树
572. 另一棵树的子树
226. 翻转二叉树
101. 对称二叉树
110. 平衡二叉树
牛客网——JZ36 二叉搜索树与双向链表
牛客网——KY11 二叉树遍历
100. 相同的树
题目:
给你两棵二叉树的根节点
p
和q
,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入:p = [1,2,3], q = [1,2,3] 输出:true示例 2:
输入:p = [1,2], q = [1,null,2] 输出:false示例 3:
输入:p = [1,2,1], q = [1,1,2] 输出:false提示:
- 两棵树上的节点数目都在范围
[0, 100]
内-104 <= Node.val <= 104
思路: 按照上面的套路,我们应该找到一个节点所做的事情,即判断这个节点是否相同。
if (p.val != q.val) {return false;
}
上面这个代码的确是我们判读判断的逻辑,但是还要注意 p 和 q 可能出现为 null 的情况。因此还要排除,并且当两者同时为 null 时,我们要返回 true。因为空树也是相同的树。
// 一个是空树,一个不是,不符合
if (p == null && q != null || p != null && q == null) {return false;
}
// 两个都是空树,符合
if (p == null && q == null) {return true;
}
一个节点的事情处理完了,就该开始套框架,递归了。我们先不看框架,这个方法处理的是一个节点的(可以理解为根结点),接下来就要开始处理左子树和右子树。也就是递归处理。
// 判断左子树 判断右子树
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
只有当左右子树和根都为true时,才能返回true。
思路整理完成就可以实现全部的代码了。
代码实现:
class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {// 根结点的判断if (p == null && q != null || p != null && q == null) {return false;}if (p == null && q == null) {return true;}if (p.val != q.val) {return false;}// 左右子树的判断return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);}
}
注意:如果我们是在不放心这个方法,那么写完之后,就可以检查这个方法内容是否满足递归的两个条件:1、存在限制条件;2、每次递归之后都将进一步接近这个条件。
限制条件:就是什么时候,这个递归将会停止。很明显,当遇到空树时,就可以停止了,因为空树没有左右子树了。我们上面的代码满足这个条件,遇到空树就会返回。
随着递归的深入,我们会很明显的发现越来越接近限制条件。
怎么样?是不是觉得这个方法非常的好用?是不是觉得自己现在强的可怕?别担心,下面还有很多硬菜等着我们去品尝,慢慢来吧。
572. 另一棵树的子树
题目:
给你两棵二叉树
root
和subRoot
。检验root
中是否包含和subRoot
具有相同结构和节点值的子树。如果存在,返回true
;否则,返回false
。二叉树
tree
的一棵子树包括tree
的某个节点和这个节点的所有后代节点。tree
也可以看做它自身的一棵子树。示例 1:
输入:root = [3,4,5,1,2], subRoot = [4,1,2] 输出:true示例 2:
输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2] 输出:false提示:
root
树上的节点数量范围是[1, 2000]
subRoot
树上的节点数量范围是[1, 1000]
-104 <= root.val <= 104
-104 <= subRoot.val <= 104
思路:判断一棵树是否为另一棵树的子树,换句话说,就是看一棵树中是否有子树和另一棵树相同。可以理解为上一题的变形版。同样,先明确根结点要做的事情,判断根结点所在的树是否与另一颗相同,另外就是套框架,递归根结点的左子树、右子树,看是否与另一个子树相同
根结点做的事情:
// 根结点为空,直接不需要比较了,这个也是限制条件
if (root == null) {return false;
}
// 判断根结点所在的子树是否另一棵子树相同
if (isSameTree(root, subRoot)) {return true;
}
框架:
// 左子树相同了,就不需要比较了
if (isSubtree(root.left, subRoot)) {return true;
}
// 不管右子树的比较结果如何,都可以直接返回了
return isSubtree(root.right, subRoot);
代码实现:
class Solution {public boolean isSubtree(TreeNode root, TreeNode subRoot) { // 判断是否存在root的子树和subRoot是相同的树// 限制条件:什么时候可以停止递归了?root为null了,找不到了if (root == null) {return false;}// 先判断根结点if (isSameTree(root, subRoot)) {return true;}// 递归判断左子树if (isSubtree(root.left, subRoot)) {return true;}// 递归判断右子树return isSubtree(root.right, subRoot);}// 判断这两颗树是否相同private boolean isSameTree(TreeNode root, TreeNode subRoot) {// 根 左子树 右子树if (root == null && subRoot != null || root != null && subRoot == null) {return false;}if (root == null && subRoot == null) {return true;}if (subRoot.val != root.val) {return false;}// 递归判断左子树 && 递归判断右子树return isSameTree(root.left, subRoot.left) && isSameTree(root.right, subRoot.right);}
}
226. 翻转二叉树
题目:
给你一棵二叉树的根节点
root
,翻转这棵二叉树,并返回其根节点。示例 1:
输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2:
输入:root = [2,1,3] 输出:[2,3,1]示例 3:
输入:root = [] 输出:[]提示:
- 树中节点数目范围在
[0, 100]
内-100 <= Node.val <= 100
思路一:翻转二叉树就是将每个结点的左子树和右子树都进行交换。
根结点做的事情:
交换根的左子树和根的右子树。
// 空节点不需要交换
if (root == null) {return root;
}
// 交换
TreeNode tmp = root.left;
root.left = root.right;
root.right = tmp;
框架:
// 根的左子树 和 根的右子树
invertTree(root.left);
invertTree(root.right);
代码实现:
class Solution {public TreeNode invertTree(TreeNode root) {if (root == null) {return root;}// 先翻转根结点TreeNode tmp = root.left;root.left = root.right;root.right = tmp;// 翻转左子树invertTree(root.left);// 翻转右子树invertTree(root.right);return root;}
}
其实,如果我们仔细观察会发现,叶子结点是不需要交换的,因为叶子结点的左子树和右子树都是空,交换前后不变。
if (root.left == null && root.right == null) {return root;
}
注意:虽然我们的限制条件改成了叶子结点,但是root 判空的语句还是得有,因为测试用例的root可能为null。
思路二:上面的思路是从根结点开始进行交换,但是进行左右子树交换时,并没有用到其返回值,因此,这个思路就是先从根的左子树和右子树开始交换,交换的结果储存起来,再去交换根的左右子树。
根结点做的事情:
if (root == null) {return root;
}
// 叶子结点直接返回即可
if (root.left == null && root.right == null) {return root;
}
// 根的左子树和右子树进行了递归翻转
....... // 开始交换本级根的左子树和右子树
root.left = rightTree;
root.right = leftTree;
框架:
// 翻转左子树的结果
TreeNode leftTree = invertTree(root.left);
// 翻转右子树的结果
TreeNode rightTree = invertTree(root.right);
代码实现:
class Solution {public TreeNode invertTree(TreeNode root) {if (root == null) {return root;}// 叶子结点直接返回即可if (root.left == null && root.right == null) {return root;}// 翻转左子树的结果TreeNode leftTree = invertTree(root.left);// 翻转右子树的结果TreeNode rightTree = invertTree(root.right);// 开始交换本级根的左子树和右子树root.left = rightTree;root.right = leftTree;return root;}
}
101. 对称二叉树
题目:
给你一个二叉树的根节点
root
, 检查它是否轴对称。示例 1:
输入:root = [1,2,2,3,4,4,3] 输出:true示例 2:
输入:root = [1,2,2,null,3,null,3] 输出:false提示:
- 树中节点数目在范围
[1, 1000]
内-100 <= Node.val <= 100
思路:判断是否为对称二叉树其实就是看这个根结点的左右子树是否可以翻转。那么这个题目就变成了判断根的左右子树是可以翻转
public boolean isSymmetric(TreeNode root) {// 比较根结点的左子树和右子树return invertTree(root.left, root.right);
}
根结点做的事情:(节点是否相同)
if (left == null && right != null || left != null && right == null) {return false;
}
if (left == null && right == null) {return true;
}
if (left.val != right.val) {return false;
}
框架:
// 最外围是否可以翻转 、 内围是否可以翻转
return invertTree(left.left, right.right) && invertTree(left.right, right.left);
代码实现:
class Solution {public boolean isSymmetric(TreeNode root) {// 比较根结点的左子树和右子树return invertTree(root.left, root.right);}// 就是比较对应结点的值是否一样public boolean invertTree(TreeNode left, TreeNode right) {if (left != null && right == null || left == null && right != null) {return false;}if (left == null && right == null) {return true;}if (left.val != right.val) {return false;}return invertTree(left.left, right.right) && invertTree(left.right, right.left); }
}
110. 平衡二叉树
给定一个二叉树,判断它是否是 平衡二叉树
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:true示例 2:
输入:root = [1,2,2,3,3,null,null,4,4] 输出:false示例 3:
输入:root = [] 输出:true提示:
- 树中的节点数在范围
[0, 5000]
内-104 <= Node.val <= 104
首先得明确一个概念:什么是平衡二叉树。
平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1。
注意:是所有结点的左右子树,而不是根结点的左右子树。
思路:我们首先想到的就是求树的高度,然后相减判断差值是否大于1。
根结点做的事情:先判断根结点是不是平衡二叉树
// 限制条件if (root == null) {return true;}// 这个判断的是根结点if (Math.abs(TreeNodeHigh(root.left) - TreeNodeHigh(root.right)) > 1) {return false;}
框架:根结点判断完成再判断左右子树是否是平衡二叉树
// 递归判断左子树和右子树if (!isBalanced(root.left)) {return false;}return isBalanced(root.right);
计算树的高度:
// 计算二叉树的高度private int TreeNodeHigh(TreeNode root) {if (root == null) {return 0;}// 左子树的高度int leftHigh = TreeNodeHigh(root.left);// 右子树的高度int rightHigh = TreeNodeHigh(root.right);// 返回左子树和右子树的最大高度+根结点return Math.max(leftHigh, rightHigh)+1;}
代码实现:
class Solution {// 这个方法是用来判断一个二叉树是否为平衡二叉树的// 而我们想要的是一个方法来计算这个二叉树的根结点的左右子树高度public boolean isBalanced(TreeNode root) {if (root == null) {return true;}// 这个判断的是根结点if (Math.abs(TreeNodeHigh(root.left) - TreeNodeHigh(root.right)) > 1) {return false;}// 递归判断左子树和右子树if (!isBalanced(root.left)) {return false;}return isBalanced(root.right);}// 计算二叉树的高度private int TreeNodeHigh(TreeNode root) {if (root == null) {return 0;}// 左子树的高度int leftHigh = TreeNodeHigh(root.left);// 右子树的高度int rightHigh = TreeNodeHigh(root.right);// 返回左子树和右子树的最大高度+根结点return Math.max(leftHigh, rightHigh)+1;}
}
上述代码有不足的地方:重复计算比较多。当根结点是平衡二叉树时,就需要计算根结点左子树的左右子树的高度,而这部分的高度是我们在第一次计算时,就已经计算过了。因此我们就可以保留上一次计算的值,也就是存起来或者说记录上次计算的值,看看满不满足我们的要求。如下所示:
代码实现:
class Solution {public boolean isBalanced(TreeNode root) {if (root == null) {return true;}// 因为返回值就三种:<0 ==0 >0 最后就比较看是否符合情况return TreeNodeHigh(root) >= 0;}private int TreeNodeHigh(TreeNode root) {if (root == null) {return 0;}int leftHigh = TreeNodeHigh(root.left);// 如果不符合要求了,就返回-1(标记)if (leftHigh < 0) {return -1;}int rightHigh = TreeNodeHigh(root.right);// 符合要求(高度差符合平衡二叉树且右边的高度大于0)就返回高度if (rightHigh >= 0 && Math.abs(leftHigh - rightHigh) <= 1) {return Math.max(leftHigh, rightHigh) + 1 ;} else {// 不符合(高度差大于1或者右边的高度也是负数)就返回-1return -1;}}
}
这种方法还是大佬才能想到的。我们一般把第一种的普通递归思路写出来就行。
牛客网——JZ36 二叉搜索树与双向链表
题目:
描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示
数据范围:输入二叉树的节点数 0≤𝑛≤10000≤n≤1000,二叉树中每个节点的值 0≤𝑣𝑎𝑙≤10000≤val≤1000
要求:空间复杂度𝑂(1)O(1)(即在原树上操作),时间复杂度 𝑂(𝑛)O(n)注意:
1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继
2.返回链表中的第一个节点的指针
3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构4.你不用输出双向链表,程序会根据你的返回值自动打印输出
输入描述:
二叉树的根节点
返回值描述:
双向链表的其中一个头节点。
示例1
输入:
{10,6,14,4,8,12,16}返回值:
From left to right are:4,6,8,10,12,14,16;From right to left are:16,14,12,10,8,6,4;说明:
输入题面图中二叉树,输出的时候将双向链表的头节点返回即可。示例2
输入:
{5,4,#,3,#,2,#,1}返回值:
From left to right are:1,2,3,4,5;From right to left are:5,4,3,2,1;说明:
5/4/3/2/1 树的形状如上图
二叉搜索树的概念:树上每个节点的左子树的根结点的值小于根结点的值小于右子树的根结点的值。因此,当我们去用中序遍历去遍历这棵树时,其输出的结果的就是一个有序的数据。
思路:既然是要变成一个有序的双向链表,那么我们就可以从这里得出一些有用的信息。肯定是以中序遍历的方式去遍历这棵二叉树。修改的话,以 left 作为 prev 指针,以 right 作为 next 指针。那么我们就可以写一个二叉树中序遍历的方法出来,通过中序遍历来修改二叉树的指向。
下面是递归的核心代码:
// 中序遍历修改二叉树的指向private void inOrder(TreeNode root) {// 左子树 根 右子树if (root == null) { // 限制条件return;}// 左子树inOrder(root.left);// 修改根结点的指向......// 右子树inOrder(root.right);}
当 root 走到 4 这个节点时(上面描述的图),就可以修改其 left 与 right 的值,因为这里需要一个不断变化的值来指向 left 和 right 要修改的对象,因此就可以定义一个 prev 指针来指向要修改的前一个节点,那么就可以解决修改指针的问题。
代码实现:
public class Solution {private TreeNode prev; // 默认是nullpublic TreeNode Convert(TreeNode pRootOfTree) {if (pRootOfTree == null) {return null;}// 修改二叉树为有序的双向链表inOrder(pRootOfTree);// 找到头结点并返回TreeNode head = pRootOfTree;// 一直找到 head.left == null 即可(沿着10找到4)while (head.left != null) {head = head.left;}return head;}// 中序遍历修改二叉树的指向private void inOrder(TreeNode root) {// 左子树 根 右子树if (root == null) { // 限制条件return;}// 左子树inOrder(root.left);// 修改根结点的指向// 第一三行代码都执行时,是这样:4.left = prev 4.right = 6root.left = prev;if (prev != null) {prev.right = root;}// 更新prev的值(不断的指向root的前一个结点)prev = root; // 右子树inOrder(root.right);}
}
牛客网——KY11 二叉树遍历
描述
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
输入描述:
输入包括1行字符串,长度不超过100。
输出描述:
可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。
示例1
输入:
abc##de#g##f###输出:
c b e g d f a
注意:这里给了我们前序遍历的结果,并且把空树的位置告诉我们了,因此这里可以只通过前序遍历来创建一棵唯一的二叉树。
思路:既然给了我们前序遍历的结果,那么我们肯定是要通过前序遍历来创建二叉树。即先创建根结点,再创建左子树,再创建右子树。核心代码思路出来了,也就可以开始写了。
代码实现:
import java.util.Scanner;// 创建树的节点
class TreeNode {public char val;public TreeNode left;public TreeNode right;public TreeNode(char val) {this.val = val;}
}// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseString str = in.nextLine();// 以前序遍历的方式来创建二叉树TreeNode root = createTree(str);// 中序遍历二叉树inOrder(root);}}// 递归创建二叉树public static int i; // 记录遍历的位置public static TreeNode createTree(String str) {// 根据前序遍历创建二叉树:根 左子树 右子树TreeNode root = null;char ch = str.charAt(i);if (ch != '#') {// 这里不是空树,创建树:根 左子树 右子树root = new TreeNode(ch);i++; // 创建完成,就要往后走// 左子树root.left = createTree(str);// 右子树root.right = createTree(str);} else {// 因为root已经初始化,这里只需要让i往后走即可i++;}return root;}public static void inOrder(TreeNode root) {if (root == null) {return;}// 根 左子树 右子树inOrder(root.left);System.out.print(root.val+" ");inOrder(root.right);}}
二叉树的创建中根结点做的事情: 就是创建根结点即可。其余的就是交给框架去递归创建左子树和右子树。
好啦!本期 数据结构之初始二叉树(3)的刷题篇(上)的学习之旅就到此结束啦!我们下一期再一起学习吧!
相关文章:

数据结构之初始二叉树(3)
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:数据结构(Java版) 二叉树的基本操作 通过上篇文章的学习,我们简单的了解了二叉树的相关操作。接下来就是有…...
egret 白鹭的编译太慢了 自己写了一个
用的swc 他会检测git的改变 const simpleGit require(simple-git); const fs require(fs); const path require(path); // 初始化 simple-git const swc require(swc/core); const baseDir D:\\project; const gameDir game\\module\\abcdefg; const gitDir D:\\projec…...

<数据集>pcb板缺陷检测数据集<目标检测>
数据集格式:VOCYOLO格式 图片数量:693张 标注数量(xml文件个数):693 标注数量(txt文件个数):693 标注类别数:6 标注类别名称:[missing_hole, mouse_bite, open_circuit, short, spurious_copper, spur…...
实验四:图像的锐化处理
目录 一、实验目的 二、实验原理 1. 拉普拉斯算子 2. Sobel算子 3. 模板大小对滤波的影响 三、实验内容 四、源程序和结果 (1) 主程序(matlab) (2) 函数GrayscaleFilter (3) 函数MatrixAbs 五、结果分析 1. 拉普拉斯滤波 2. Sobel滤波 3. 不同大小模板的滤波…...

【Linux】权限的管理和Linux上的一些工具
文章目录 权限管理chgrpchownumaskfile指令sudo指令 目录权限粘滞位Linux中的工具1.软件包管理器yum2.rzsz Linux开发工具vim 总结 权限管理 chgrp 功能:修改文件或目录的所属组 格式:chgrp [参数] 用户组名 文件名 常用选项:-R 递归修改文…...
ES6 字符串的新增方法(二十)
1. String.prototype.startsWith(searchString, position) 特性:判断字符串是否以指定的子字符串开始。 用法:检查字符串的开始部分。 const str "Hello World"; console.log(str.startsWith("Hello")); // 输出:true…...
如何将MP3或WAV文件解码成PCM文件
文章目录 概要整体架构流程技术细节 概要 本文介绍使用 FFmpeg,将MP3或WAV文件解码成PCM文件的方法。 整体架构流程 首先,使用的 FFmpeg 库要支持 MP3/WAV 解码功能,即编译的时候要加上(编译 FFmpeg 库可以参考:Win…...

OpenAI 推出 GPT-4o mini,一种更小、更便宜的人工智能模型
OpenAI 最近推出了新型人工智能模型 GPT-4o mini,以其较小体积和低成本受到关注。这款模型在文本和视觉推理任务上性能优越,且比现有小型模型更快、更经济。GPT-4o mini 已向开发者和消费者发布,企业用户将在下周获得访问权限。 喜好儿网 在…...
Nacos 服务发现(订阅)源码分析(服务端)
前言: 前文我们分析了 Nacos 服务发现(订阅)的流程,从 Nacos Client 端的源码分析了服务发现的过程,服务发现最终还是要调用 Nacos Server 端来获取服务信息,缓存到客户端本地,并且会定时向 Na…...

DICOM CT\MR片子免费在线查看工具;python pydicom包加载查看;mayavi 3d查看
DICOM CT\MR片子免费在线查看工具 参考: https://zhuanlan.zhihu.com/p/668804209 dicom格式: DICOM(Digital Imaging and Communications in Medicine)是医学数字成像和通信的标准。它定义了医学图像(如CT、MRI、X…...

VSCode远程连接Ubuntu/Linux
文章目录 前言SSH(Secure Shell)简介主要功能工作原理常见的 SSH 客户端和服务器 Ubuntu安装sshvscode远程插件安装远程插件开始远程连接 打开文件夹新建终端 总结 前言 在现代开发环境中,远程工作和跨平台开发变得越来越普遍。Visual Studi…...
【Nginx80端口被占用】80端口被System占用如何解决【已解决】
【Nginx80端口被占用】80端口被System占用如何解决【已解决】 01 问题背景 Nginx 版本 1.19及以上80端口被System占用,无法kill tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::80 :::* LISTEN 1/systemd 执行以下代码无效&…...
云计算的发展历程与边缘计算
云计算的发展历程 初期发展(1960s-1990s) 概念萌芽:云计算的概念可以追溯到1960年代,当时约翰麦卡锡(John McCarthy)提出了“计算将来可能成为一种公共设施”的想法。这个概念类似于现代的云计算…...

199.二叉树的右视图(DFS)
给定一个二叉树的根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 示例 2: 输入: [1,null,3] 输出: [1,3] 示例 3: 输入: [] 输出: [] 解题…...

机器学习基础入门(1)
最近也在努力的想要学习些机器学习的知识,目前正在了解各个概念及术语,下面就把学习到的概念都列出来。 人工智能 (AI) Artificial intelligence 人工智能生成内容(AIGC) 机器学习(ML) Machine Learning …...

mybatis的xml中,where标签不自动删除多余的and之类的问题
遇到了这个莫名其妙的问题,起初是很疑惑的,where标签好像失灵了一般不会自动删除掉 多余的and 看了眼sql语句,发现还是有and没被删除。 后来重新写了遍后发现又没事了。真的是神人。 然后就研究了好一会,发现!&#…...
RK3588 编译opencvopencv_contrib记录
RK3588 编译opencv&opencv_contrib记录 1. 下载文件1.1 opencv源码1.2 安装cmake 2.开始编译2.1 提示缺少boostdesc_bgm.i 等问题2.2 提示缺少某hpp头文件2.3 其它问题 3. 设置环境变量4. 测试5.参考 1. 下载文件 1.1 opencv源码 需要opencv和opencv-contrib的版本号保持…...
Eureka: 微服务架构中的服务发现与注册实践
Eureka介绍与使用教程 你好,我是悦创。 Eureka 是 Netflix 开发的一款服务发现(Service Discovery)工具,它主要用于云中基于微服务架构的应用程序。Eureka使服务实例能够动态地注册自己,而其他服务实例可以通过 Eure…...

8、添加第三方包
目录 1、安装Django Debug Toolbar Django的一个优势就是有丰富的第三方包生态系统。这些由社区开发的包,可以用来快速扩展应用程序的功能集 1、安装Django Debug Toolbar Django Debug Toolbar位于名列前三的第三方包之一 这是一个用于调试Debug Web应用程序的有…...

【算法】算法模板
算法模板 文章目录 算法模板简介数组字符串列表数学树图动态规划 简介 博主在LeetCode网站中学习算法的过程中使用到并总结的算法模板,在算法方面算是刚过初学者阶段,竞赛分数仅2000。 为了节省读者的宝贵时间,部分基础的算法与模板未列出。…...

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

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...