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

​数据结构之初始二叉树(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)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 二叉树的基本操作 通过上篇文章的学习&#xff0c;我们简单的了解了二叉树的相关操作。接下来就是有…...

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板缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;693张 标注数量(xml文件个数)&#xff1a;693 标注数量(txt文件个数)&#xff1a;693 标注类别数&#xff1a;6 标注类别名称&#xff1a;[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 功能&#xff1a;修改文件或目录的所属组 格式&#xff1a;chgrp [参数] 用户组名 文件名 常用选项&#xff1a;-R 递归修改文…...

ES6 字符串的新增方法(二十)

1. String.prototype.startsWith(searchString, position) 特性&#xff1a;判断字符串是否以指定的子字符串开始。 用法&#xff1a;检查字符串的开始部分。 const str "Hello World"; console.log(str.startsWith("Hello")); // 输出&#xff1a;true…...

如何将MP3或WAV文件解码成PCM文件

文章目录 概要整体架构流程技术细节 概要 本文介绍使用 FFmpeg&#xff0c;将MP3或WAV文件解码成PCM文件的方法。 整体架构流程 首先&#xff0c;使用的 FFmpeg 库要支持 MP3/WAV 解码功能&#xff0c;即编译的时候要加上&#xff08;编译 FFmpeg 库可以参考&#xff1a;Win…...

OpenAI 推出 GPT-4o mini,一种更小、更便宜的人工智能模型

OpenAI 最近推出了新型人工智能模型 GPT-4o mini&#xff0c;以其较小体积和低成本受到关注。这款模型在文本和视觉推理任务上性能优越&#xff0c;且比现有小型模型更快、更经济。GPT-4o mini 已向开发者和消费者发布&#xff0c;企业用户将在下周获得访问权限。 喜好儿网 在…...

Nacos 服务发现(订阅)源码分析(服务端)

前言&#xff1a; 前文我们分析了 Nacos 服务发现&#xff08;订阅&#xff09;的流程&#xff0c;从 Nacos Client 端的源码分析了服务发现的过程&#xff0c;服务发现最终还是要调用 Nacos Server 端来获取服务信息&#xff0c;缓存到客户端本地&#xff0c;并且会定时向 Na…...

DICOM CT\MR片子免费在线查看工具;python pydicom包加载查看;mayavi 3d查看

DICOM CT\MR片子免费在线查看工具 参考&#xff1a; https://zhuanlan.zhihu.com/p/668804209 dicom格式&#xff1a; DICOM&#xff08;Digital Imaging and Communications in Medicine&#xff09;是医学数字成像和通信的标准。它定义了医学图像&#xff08;如CT、MRI、X…...

VSCode远程连接Ubuntu/Linux

文章目录 前言SSH&#xff08;Secure Shell&#xff09;简介主要功能工作原理常见的 SSH 客户端和服务器 Ubuntu安装sshvscode远程插件安装远程插件开始远程连接 打开文件夹新建终端 总结 前言 在现代开发环境中&#xff0c;远程工作和跨平台开发变得越来越普遍。Visual Studi…...

【Nginx80端口被占用】80端口被System占用如何解决【已解决】

【Nginx80端口被占用】80端口被System占用如何解决【已解决】 01 问题背景 Nginx 版本 1.19及以上80端口被System占用&#xff0c;无法kill tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::80 :::* LISTEN 1/systemd 执行以下代码无效&…...

云计算的发展历程与边缘计算

云计算的发展历程 初期发展&#xff08;1960s-1990s&#xff09; 概念萌芽&#xff1a;云计算的概念可以追溯到1960年代&#xff0c;当时约翰麦卡锡&#xff08;John McCarthy&#xff09;提出了“计算将来可能成为一种公共设施”的想法。这个概念类似于现代的云计算&#xf…...

199.二叉树的右视图(DFS)

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

机器学习基础入门(1)

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

mybatis的xml中,where标签不自动删除多余的and之类的问题

遇到了这个莫名其妙的问题&#xff0c;起初是很疑惑的&#xff0c;where标签好像失灵了一般不会自动删除掉 多余的and 看了眼sql语句&#xff0c;发现还是有and没被删除。 后来重新写了遍后发现又没事了。真的是神人。 然后就研究了好一会&#xff0c;发现&#xff01;&#…...

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介绍与使用教程 你好&#xff0c;我是悦创。 Eureka 是 Netflix 开发的一款服务发现&#xff08;Service Discovery&#xff09;工具&#xff0c;它主要用于云中基于微服务架构的应用程序。Eureka使服务实例能够动态地注册自己&#xff0c;而其他服务实例可以通过 Eure…...

8、添加第三方包

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

【算法】算法模板

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

特征工程方法总结

方法有以下这些 首先看数据有没有重复值、缺失值情况 离散&#xff1a;独热 连续变量&#xff1a;离散化&#xff08;也成为分箱&#xff09; 作用&#xff1a;1.消除异常值影响 2.引入非线性因素&#xff0c;提升模型表现能力 3.缺点是会损失一些信息 怎么分&#xff1a;…...

Unity | AssetBundle

1 定义 Unity中的一种特殊资源包格式&#xff0c;用于存储和分发游戏资源。这些资源可以包括模型、纹理、音频文件、预制体、场景等。 AssetBundle允许开发者在游戏运行时动态加载和卸载资源&#xff0c;从而实现灵活的资源管理。 2 使用场景 1、资源管理 有效管理游戏中的资…...

【虚幻引擎】C++网络通信TCP和HTTP实战开发全流程,以接入科大讯飞星火大模型和文心一言千帆大模型为案例讲解

本套课程介绍了使用我们的虚幻C去写开发我们的插件开发&#xff0c;如何使用我们的虚幻C 封装我们的TCP和HTTP&#xff0c;如何使用的我们虚幻C子系统&#xff0c;如何根据第三方文档去写接口请求&#xff0c;如何通过我们的加密算法去签名我们的URL&#xff0c;如何声明我们的…...

.NET单元测试使用AutoFixture按需填充的方法总结

AutoFixture是一个.NET库&#xff0c;旨在简化单元测试中的数据设置过程。通过自动生成测试数据&#xff0c;它帮助开发者减少测试代码的编写量&#xff0c;使得单元测试更加简洁、易读和易维护。AutoFixture可以用于任何.NET测试框架&#xff0c;如xUnit、NUnit或MSTest。 默…...

求职学习day5

安排明天hr面 投一下平安可能。 hr面准备&#xff0c;复习java核心技术&#xff0c;复习java项目。 正视自己&#xff0c;调整心态。 也是很早接触了javaguide但是没有持续学习&#xff0c;项目介绍 | JavaGuide&#xff0c;面试前复习一下感觉还是很有收获的。 还有一些…...

微服务常用的中间件有哪些?都有什么用途?

前言 最近整理一下我们的项目使用了哪些中间件&#xff0c;借此机会也来分享一下&#xff0c;在微服务架构中我们常用的那些中间件&#xff0c;都有什么作用&#xff0c;为什么要使用中间件。 消息中间件-RocketMQ 比如RocketMQ&#xff0c;RocketMQ 是一个开源的分布式消息…...

华为云认证

华为云认证 首页 云原生 DevOps工作级开发者认证&#xff1a;HCCDP – Cloud Native DevOps 对云上敏捷开发感兴趣的人员&#xff0c;培训DevOps的理论知识及在云端交付软件全生命周期的实操能力。 DevOps...

【Linux学习】常用基本指令

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a;Linux学习 目录 &#x1f308;前言&#x1f525;XShell的一些使用查看Linux主机IP使用XShell登录主机XShell下的复制粘贴 &#x1f525;Linux下常用基本指令ls指令pwd指令cd指定touch指令…...

windows上安装Apache

安装前须知&#xff1a; 下载并安装&#xff0c;如未完成&#xff0c;请访问下载页面。安装Apache前需要安装Visual C Redistributable for Visual Studio 2015-2022 x64。 解压与配置&#xff1a; 将Apache24文件夹解压至C:\Apache24&#xff08;这是配置中的ServerRoot&am…...

wps office 2019 Pro Plus 集成序列号Vba安装版教程

前言 wps office 2019专业增强版含无云版是一款非常方便的办公软件&#xff0c;我们在日常的工作中总会碰到需要使用WPS的时候&#xff0c;它能为我们提供更好的文档编写帮助我们更好的去阅读PDF等多种格式的文档&#xff0c;使用起来非常的快捷方便。使用某银行专业增强版制作…...

wordpress顶踩仿织梦/在线搜索资源

思路1&#xff1a;使用回溯法&#xff0c;同时剪掉不合理分支 // 产生不同的括号队列&#xff0c;选用回溯法 class Solution { public:vector<string> res;vector<string> generateParenthesis(int n) {string str "";backtrack(0,0,n,str);return re…...

沃噻网站建设流程/营销网站建设免费

tensorflow是一个开源软件库&#xff0c;用于使用数据流图进行数值计算。图中节点表示数学运算&#xff0c;图边表示在它们之间传递的多维数据数组。该库包括各种功能&#xff0c;使你可以实现和探索用于图像和文本处理的前沿卷积神经网络和循环神经网络RNN架构。由于复杂计算以…...

邮件格式模板/太原seo快速排名

原标题&#xff1a;能测血压&#xff0c;还有心电图&#xff0c;兼顾9大运动模式&#xff0c;dido手环还不错随着科技的不断进步&#xff0c;高科技产品不断的涌向市场&#xff0c;无论是从0到1的新概念产品&#xff0c;还是科技互联网赋能的加持产品&#xff0c;都得到了快速的…...

为什么很多公司没自己的网站/百度seo哪家公司好

创建容器时指定网络模式 docker run -d -p 外部访问端口:容器内端口 --net"网络模式" -v 本机目录:容器内目录 --name"容器名称" 镜像名 要执行的角本 docker ps 查看启动的容器列表 docker ps -a 查看所有的容器列表 docker start 容器名称 …...

http文件转wordpress/百度极简网址

cl_cache的定位还未设定&#xff1a; cl_cache 这是一种机制&#xff0c;用于缓存应用程序以文本形式提供的 OpenCL 内核的二进制表示。通过存储二进制表示&#xff0c;只需要第一次编译&#xff0c;这提高了性能。 在工作目录中&#xff0c;手动创建 cl 缓存目录。驱动程序将使…...

企业网络搭建与应用试题及答案/seo兼职招聘

1 冒泡排序 BubbleSort 1.1 原理&#xff1a; 多次扫描整个数组&#xff0c;每次扫描都比较相邻两个元素&#xff0c;如果逆序&#xff0c;则交换两个元素。 第一次扫描结果是数值最大元素到数组的最后位置&#xff0c;比较的次数是n(数组长度)-1。 第二次扫描&#xff0c;因为…...