外文网站制作/精准推广

外文网站制作,精准推广,怎么做直播网站刷弹幕,中国义乌小商品批发网目录 二叉树进阶oj题1.根据二叉树创建字符串2.二叉树的层序遍历3.二叉树的层序遍历 II4.二叉树的最近公共祖先5.二叉搜索树和双向链表6.从前序与中序遍历序列构造二叉树7.从中序和后序遍历序列来构造二叉树8.二叉树的前序遍历,非递归迭代实现9.二叉树中序遍历 &…

目录

  • 二叉树进阶oj题
    • 1.根据二叉树创建字符串
    • 2.二叉树的层序遍历
    • 3.二叉树的层序遍历 II
    • 4.二叉树的最近公共祖先
    • 5.二叉搜索树和双向链表
    • 6.从前序与中序遍历序列构造二叉树
    • 7.从中序和后序遍历序列来构造二叉树
    • 8.二叉树的前序遍历,非递归迭代实现
    • 9.二叉树中序遍历 ,非递归迭代实现
    • 10.二叉树的后序遍历 ,非递归迭代实现

二叉树进阶oj题

1.根据二叉树创建字符串

根据二叉树创建字符串:

image-20240923095720602

分析:

image-20240924214607725

先递归左子树,再递归右子树,每递归到一个节点就套娃一个()。

要注意,当一个根节点的左孩子不存在右孩子存在时,要用一个()表示左孩子

class Solution {
public:string tree2str(TreeNode* root){// str作为最后的输出的字符串string str;// 要求前序遍历——根,左子树,右子树str += to_string(root->val);// 这里要分类讨论://1.左不为空//2.左空,右不为空 这个情况要保留一个左的括号if (root->left){str += "(";str += tree2str(root->left);str += ")";}else if (root->right){str += "()";}if (root->right){str += "(";str += tree2str(root->right);str += ")";}return str;}
};

2.二叉树的层序遍历

二叉树的层序遍历

image-20240923095738735

分析:

层序遍历就采用一个队列就可以实现。一个节点出来要记得带它的做右子树进节点

代码如下:

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root){vector<vector<int>> vv;queue<TreeNode*> _q; // 通过队列实现层序// 传空树进行不需要遍历了。if (root)_q.push(root);while (!_q.empty()){// 通过控制每层的数据个数,来达到精确的输出二叉树每层的数据// 意思就是 当第n层数据出完之后,第n+1层的数据个数就是此时的q.size()int levelSize = _q.size();vector<int> v;for (size_t i = 0; i < levelSize; i++){TreeNode* front = _q.front();_q.pop();v.push_back(front->val);// 弹出节点后要带该节点的左右孩子if (front->left)_q.push(front->left);if (front->right)_q.push(front->right);}// 此时v就是装好了一层的数据,将其尾插到vv中vv.push_back(v);}return vv;}
};

3.二叉树的层序遍历 II

二叉树的层序遍历 II:

image-20240923095754004

分析:

这道题和第2道题的思路是一样的,只需要将最后的结果逆置,也就是vv逆置一下,再输出就是自下而上的层序遍历

代码如下:

class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root){vector<vector<int>> vv;queue<TreeNode*> _q; // 通过队列实现层序// 传空树进行不需要遍历了。if (root)_q.push(root);while (!_q.empty()){// 通过控制每层的数据个数,来达到精确的输出二叉树每层的数据// 意思就是 当第n层数据出完之后,第n+1层的数据个数就是此时的q.size()int levelSize = _q.size();vector<int> v;for (size_t i = 0; i < levelSize; i++){TreeNode* front = _q.front();_q.pop();v.push_back(front->val);// 弹出节点后要带该节点的左右孩子if (front->left)_q.push(front->left);if (front->right)_q.push(front->right);}// 此时v就是装好了一层的数据,将其尾插到vv中vv.push_back(v);}// 只要逆置一下,就是自底向上的层序遍历reverse(vv.begin(), vv.end());return vv;}
};

4.二叉树的最近公共祖先

二叉树的最近公共祖先

image-20240923095858455

分析:

image-20240923092914747

解决思路:

如果是第一种情况,只要判断出p、q其中一个是根节点或者p、q不在同一子树,就可以知道根节点就是公共祖先

如果不是第一种情况,就说明p、q存在于同一个子树,就要递归到其左树去寻找p、q的位置,左树没找到,就递归到右树去找到p、q的位置,在判断是什么情况。

代码如下:

class Solution {
public:bool Find(TreeNode* root, TreeNode* f){if (root == NULL)return false;// f和root不是相同节点,就递归到左子树去找,左子树找不到就递归到右树找return root == f || Find(root->left, f) || Find(root->right, f);}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q){// 如果穿了个空树进来,就不用判断了if (root == NULL)return NULL;// 只要p、q有一个是root,其公共祖先就是root了if (q == root || p == root)return root;// 定义四个变量来表示p、q的位置bool pInLeft, pInRight, qInLeft, qInRight;pInLeft = Find(root->left, p); // 去左子树找ppInRight = !pInLeft; // 左子树没找到就在右子树qInLeft = Find(root->left, q); //去左子树找qqInRight = !qInLeft;// 如果一个在左子树,一个在右子树,公共祖先就是rootif ((pInLeft && qInRight) || (pInRight && qInLeft))return root;// 如果都在左子树,就要递归到左子树去找if (pInLeft && qInLeft)return lowestCommonAncestor(root->left, p, q);// 如果都在右子树,就要递归到右子树去找if (pInRight && qInRight)return lowestCommonAncestor(root->right, p, q);return NULL;}
};

5.二叉搜索树和双向链表

二叉搜索树和双向链表

image-20240923114827276

分析:

将二叉搜索树转换为双向链表其实就是修改树节点的left和right指针按照中序遍历指向对应的节点。

这里我们让left指针指向上一个节点,right指向下一个节点

image-20240923103919808

但是这里有个问题,当我们通过中序遍历递归到一个节点的时候,这个节点的right指针是无法指向下一个节点的,因为拿不到另外一层递归深度的节点。因此这里采用双指针来解决这个问题

如下图所示:

image-20240923103645032

注意:在传双指针到函数进行调用的时候,prev要注意得传址或者传引用调用。cur不需要传引用和传址,函数内部不对cur进行赋值操作,不需要改变cur本身,要改变的是cur内部的指针

代码如下:

struct TreeNode 
{int val;struct TreeNode* left;struct TreeNode* right;TreeNode(int x):val(x),left(NULL),right(NULL) {}
}; class Solution {
public:// 这里TreeNode*&的引用一定要加,不然就用二级指针。这样才是传址调用void ConvertList(TreeNode* cur, TreeNode*& prev){if (cur == nullptr)return;// 中序遍历ConvertList(cur->left, prev);// 这里才是对当前根节点进行处理的地方,在这里连接上一个节点和下一个节点cur->left = prev; // cur的left指针指向上一个节点// 只要prev不为空的情况下,就可以让其right指针指向下一个节点if (prev)prev->right = cur;//这里对prev进行赋值,一定要注意是传值还是传址,传值调用会导致上一层的prev无法改变prev = cur; // 迭代ConvertList(cur->right, prev);}TreeNode* Convert(TreeNode* pRootOfTree){// 空树,无法转换if (pRootOfTree == nullptr)return nullptr;// 双指针解决节点连接问题TreeNode* prev = nullptr;TreeNode* cur = pRootOfTree;ConvertList(cur, prev);// 此时的双向链表就已经连接完了。// 此时的树结构被破坏了,但是依旧可以根据left指针或者right指针来找//一直找上一个节点,来找到第一个节点,或者一直找下一个节点,找到尾节点TreeNode* head = pRootOfTree;// 这里不用考虑head是否为nullptr,而导致解引用空指针崩溃// 因为pRootOfTree走到这里不可能是nullptrwhile (head->left != nullptr){head = head->left;}return head;}
};

6.从前序与中序遍历序列构造二叉树

从前序与中序遍历序列构造二叉树

image-20240923202340573

思路分析:

image-20240923163814834

image-20240923164252890

代码实现如下:

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* _buildTree(vector<int>& preorder, vector<int>& inorder, int& prei, int inbegin, int inend){// 先构建一个根节点TreeNode* root = new TreeNode(preorder[prei]);// 找到中序遍历中根节点的位置int rooti = inbegin;while (rooti <= inend){if (inorder[rooti] == preorder[prei])break;else++rooti;}// 此时找到了中序遍历的根节点,这个时候可以将中序遍历化为3个区间// 左子树区间, 根节点,右子树区间// [inbegin, rooti-1] rooti [rooti+1, inend]//这个时候还要判断左区间和右区间是否存在,才能去进行递归构建if (inbegin <= rooti - 1)root->left = _buildTree(preorder, inorder, ++prei, inbegin, rooti - 1);elseroot->left = nullptr; // 左子树不存在了,连接空// 构建完左子树之后,才构建右子树,同样的也要判断,是否存在右子树区间if (rooti + 1 <= inend)root->right = _buildTree(preorder, inorder, ++prei, rooti + 1, inend);elseroot->right = nullptr;return root;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder){// 如果是空的就不用构建了if (inorder.empty() || preorder.empty())return nullptr;//确定根节点的下标和中序遍历的范围int prei = 0;// 这个是前序遍历的下标,prei指向的是待构建的节点int inbegin = 0;int inend = inorder.size() - 1;TreeNode* ret = _buildTree(preorder, inorder, prei, inbegin, inend);return ret;}
};

注意:

这道题的本质还是通过preorder中的前序遍历来构建二叉树,但是我们并不知道prei所指向的节点到底是左子树的节点还是右子树的节点。因此我们通过中序遍历来划分区间,从而来确定prei所指向的节点是左子树的还是右子树的节点。

7.从中序和后序遍历序列来构造二叉树

从中序与后序遍历序列构造二叉树

image-20240923202352277

分析:

这个和第六题是非常像的,不一样的是,这里通过后序遍历来确定根节点的位置。中序排序的作用还是划分左子树和右子树的区间,这样才能确定根据后序遍历序列的节点左子树的节点还是右子树的节点、

image-20240924110323775

当构建完3这个根节点之后,构建20这个根节点,递归进去。

image-20240924110517201

依次类推,最终构建出右子树,在构建左子树

要想彻底理解过程,可以画出每个节点被创建出来后是如何连接到一起的。

代码如下:

class Solution {
public:TreeNode* _buildTree(vector<int>& inorder, vector<int>& postorder, int& posi, int inbegin, int inend){TreeNode* root = new TreeNode(postorder[posi]);//在中序遍历序列中找到根节点int rooti = inbegin;while(rooti <= inend){if(inorder[rooti] == postorder[posi])break;else++rooti;}// 找到了根节点就要划分区域————左子树、根、右子树// [inbegin, rooti - 1] rooti [rooti + 1, inend]if(rooti+1 <= inend)root->right = _buildTree(inorder, postorder, --posi, rooti+1, inend);else   root->right = nullptr;// 先构建完右子树后,再来构建左子树if(inbegin <= rooti-1)root->left = _buildTree(inorder, postorder, --posi, inbegin, rooti-1);elseroot->left = nullptr;return root;}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {// 如果是空的就不用构建了if(inorder.empty() || postorder.empty())return nullptr;int posi = postorder.size() - 1;int inbegin = 0;int inend = inorder.size() - 1;TreeNode* ret = _buildTree(inorder, postorder, posi, inbegin, inend);return ret;}
};

要注意:

无论是第六题还是本题,prei和posi的形参都必须加上引用或者是指针,不然的话,递归深了,对其进行++,上一层递归深度的函数的posi是不会变化的。

8.二叉树的前序遍历,非递归迭代实现

二叉树的前序遍历

image-20240924105419187

image-20240924090659133

在递归实现前序遍历二叉树的时候,我们发现访问的节点可以分为两类:

  1. 左路节点
  2. 左路节点的右子树

image-20240924090158694

因此我们只需要将整颗树分成左路节点和左路节点的右子树来访问就行了

那如何访问左路节点呢——我们需要借助一个栈

将所有左路节点放到一个栈里

image-20240924092428891

此时有三个圈,代表当前树的三个左路节点的右子树部分

image-20240924092540048

然后我们取栈里的左路节点出来,依次访问他们的右子树部分。

要注意这个访问右子树的过程是将右子树也看成一棵树来看待的,也就是说将这个右子树分成左路节点和左路节点的右子树两个部分查看。这个思路就是模仿递归的思路。只是我们通过迭代来实现这个过程

这个去栈的左路节点访问右子树部分的过程如下图所示:

image-20240924093226002

image-20240924093643900

image-20240924093900621

image-20240924094144478

image-20240924094309057

image-20240924094524242

image-20240924094732557

此时cur为空,栈也为空,意味访问结束,树已前序遍历完成

代码如下:

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {vector<int> ret;// 借助栈实现非递归的前序遍历二叉树stack<TreeNode*> st;TreeNode* cur = root;// 当cur和栈都为空的时候意味着遍历完成while(cur || !st.empty()){// 访问当前cur这棵树的所有左路节点并放到栈中while(cur){ret.push_back(cur->val);st.push(cur);cur = cur->left;}// 取栈内的左路节点,并访问其右子树TreeNode* top = st.top();st.pop();cur = top->right;}// 此时ret中存放着前序遍历的数字return ret;}
};

9.二叉树中序遍历 ,非递归迭代实现

二叉树的中序遍历

image-20240924105541553

这个题和前序遍历的思路是一样的,唯一的区别就是让左路节点入栈的时候,不能访问,取左路节点的时候,才访问该节点,并访问该节点的右子树。

image-20240924103211326

代码如下:

class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int> ret;stack<TreeNode*> st; // 借助栈实现非递归中序遍历TreeNode* cur = root;// 当cur和栈同时为空,才意味着遍历完成while(cur || !st.empty()){// 将当前cur这棵树的所有左路节点放到栈中while(cur){// 中序遍历,这里只入栈,不访问节点st.push(cur);cur = cur->left;}// 取左路节点出来,访问该左路节点//并且访问该左路节点的右子树TreeNode* top = st.top();st.pop();ret.push_back(top->val); // 放问该左路节点cur = top->right; // 指向该左路节点右子树,下一循环访问该树}// 返回ret,中序遍历的结果return ret;}
};

10.二叉树的后序遍历 ,非递归迭代实现

二叉树的后序遍历

image-20240924105911259

这里的后序遍历,需要在前两题的思路上变动一下。

大致思路不变,还是将整颗树分成左路节点和左路节点的右子树两个部分。将当前树的左路节点放到栈里,然后从栈中取左路节点出来,由于是后序,不访问左路节点,也不能将其从栈内弹出,要先访问其右子树

这里访问右子树有两种情况:

  1. 如果右子树是空,那么就访问这个左路节点,并弹出

  2. 如果右子树不为空,那么就访问右子树,并不弹出该左路节点【仍然将这个右子树分两个部分处理】

但是有一个难点就在这里,如果右子树不为空,由于上一个左路节点未弹出,如下图的2节点,就会访问两次,这个时候如何区分5这个右子树是否被访问过了?

image-20240924120044115

如果区分不出来那么程序就会陷入死循环。

解决思路:

  1. 弄一个储存标志位的栈,只要遇到右子树不是空,就给该右子树弄一个标志位,并存到栈中,等到第二次访问该节点的时候,通过取出这个标志位,判断该节点是否被访问过。
  2. 双指针,一个指针指向当前访问节点,一个指针指向上一个节点,因为后序遍历顺序是左子树、根、右子树、**因此当我想访问一个左路节点的时候,其双指针一定待在该左路节点的右孩子当中。比如访问2,双指针的另一个指针就在5。**但是我第一次取到2,不能访问2,要判断其2的右子树是否被访问过,只要双指针不在其右子树,就说明没有被访问过。

代码如下:

class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {vector<int> ret;stack<TreeNode*> st; // 用栈辅助实现非递归后序遍历二叉树// 用双指针解决——如何判断左路节点的右子树是否被访问过的问题TreeNode* cur = root;TreeNode* lastNode = nullptr; // lastNode由于记载栈顶的左路节点的右子树是否被访问过// 当cur和栈都为空,才是遍历完二叉树while(cur || !st.empty()){// 先把当前树的所有左路节点放到栈里while(cur){st.push(cur);cur = cur->left;}// 拿到栈顶的左路节点TreeNode* top = st.top();// 由于是后序,先判断栈顶元素的右子树是否被访问过.if(top->right == nullptr || lastNode == top->right){// 只要右子树为空,或者是右子树被访问过,那么就不需要在访问当前左路节点的右子树。ret.push_back(top->val); // 访问当前左路节点st.pop(); // 可以弹出该左路节点lastNode = top; // 更新lastNode的位置,保持其一直位于top的上一个访问节点}else{// 访问当前左路节点的右子树cur = top->right;}}// 返回后序遍历return ret;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/55162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

部标主动安全(ADAS+DMS)对接说明

1.前言 上一篇介绍了部标&#xff08;JT/T1078&#xff09;流媒体对接说明&#xff0c;这里说一下如何对接主动安全附件服务器。 流媒体的对接主要牵扯到4个方面&#xff1a; &#xff08;1&#xff09;平台端&#xff1a;业务端系统&#xff0c;包含前端呈现界面。 &#x…

博弈论(学习笔记)

定义何为最优&#xff01; 最优解是均衡&#xff01;&#xff08;&#xff09; 一次博弈 --- 一面之缘 复杂动态博弈&#xff1b; 路怒症----陌生人&#xff0c;一次性博弈。 一次性博弈最能暴露人性。 重复博弈太压抑了。 沙普利求解合作博弈的著名理论---如何为参与者制定利益…

GDAL Unable to open EPSG support file gcs.csv

python环境从3.6升级到3.7&#xff0c;gdal版本从2.2.4升级到3.4.1之后&#xff0c;执行原来的gdal脚本&#xff0c;结果报出如下错误 ”ERROR 4: Unable to open EPSG support file gcs.csv. Try setting the GDAL_DATA environment variable to point to the directory conta…

python画图|自制渐变柱状图

在前述学习过程中&#xff0c;我们已经通过官网学习了如何绘制渐变的柱状图及其背景。 掌握一门技能的最佳检验方式就是通过实战&#xff0c;因此&#xff0c;本文尝试做一些渐变设计。 前述学习记录可查看链接&#xff1a; Python画图|渐变背景-CSDN博客 【1】柱状图渐变 …

AI产品经理PRD文档与传统产品经理PRD有什么不同呢?

目录 模型输出&#xff1a;说白了&#xff0c;就是你的AI要干啥数据接入&#xff1a;你的AI要吃啥“粮食”验收标准&#xff1a;怎么判断你的AI干得好不好经验总结 你好&#xff0c;我是三桥君 在工作中&#xff0c;当我作为传统产品经理时&#xff0c;通常只需提供产品需求文…

【内网渗透】最保姆级的春秋云镜Flarum打靶笔记

目录 flag1 flag3 flag4​ flag2 flag1 扫外网 打的是flarum论坛&#xff0c;p牛之前有写过phar反序列化的利用&#xff1a; 从偶遇Flarum开始的RCE之旅 rockyou.txt爆出administrator/1chris&#xff0c;登录 用这个工具生成phar包 https://github.com/ambionics/p…

详解mysql和消息队列数据一致性问题

目录 前言 保持系统数据同步&#xff08;双写问题&#xff09; 消息队列消息丢失的问题 总结 前言 在当今互联网飞速发展的时代&#xff0c;随着业务复杂性的不断增加&#xff0c;消息队列作为一种重要的技术手段&#xff0c;越来越多地被应用于各种场景。它们不仅能有效解…

项目:微服务即时通讯系统客户端(基于C++QT)]四,中间界面搭建和逻辑准备

四&#xff0c;中间界面搭建 前言:当项目越来越复杂的时候&#xff0c;或许画草图是非常好的选择 一&#xff0c;初始化中间窗口initMidWindow void mainWidget::initMidWindow() {//使用网格布局进行管理QGridLayout* layout new QGridLayout();//距离上方 20px 的距离&…

Arthas redefine(加载外部的.class文件,redefine到JVM里 )

文章目录 二、命令列表2.2 class/classloader相关命令2.2.3 redefine&#xff08;加载外部的.class文件&#xff0c;redefine到JVM里 &#xff09;举例1&#xff1a;加载新的代码&#xff0c;jad/mc 命令使用举例2&#xff1a;上传 .class 文件到服务器的技巧 本人其他相关文章…

值传递和引用传递

值传递和引用传递是函数参数传递的两种类型&#xff0c;一般而言&#xff0c;基本数据类型都是值传递&#xff0c;数组和对象采用引用传递减少对象复制开销&#xff0c;但也有特例。 值和引用传递本质一样 值传递是拷贝值到函数参数&#xff0c;引用传递是拷贝引用(或者对象的指…

矿石运输船数据集、散货船数据集、普通货船数据集、集装箱船数据集、渔船数据集以及客船数据集

海船&#xff1a;用于船只检测的大规模精准标注数据集 我们很高兴地介绍一个新的大规模数据集——海船&#xff0c;该数据集专为训练和评估船只目标检测算法而设计。目前&#xff0c;这个数据集包含31,455张图像&#xff0c;并涵盖了六种常见的船只类型&#xff0c;包括矿石运…

Python基础语句教学

Python是一种高级的编程语言&#xff0c;由Guido van Rossum于1991年创建。它以简单易读的语法和强大的功能而闻名&#xff0c;被广泛用于科学计算、Web开发、数据分析等领域。 Python的应用领域广泛&#xff0c;可以用于开发桌面应用程序、Web应用、游戏、数据分析、人工智能等…

计算机视觉实战项目4(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A*路径规划+单目测距与测速+行人车辆计数等)

往期热门项目回顾&#xff1a; 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 AI健身教练-引体向上-俯卧撑计数…

Python的异步编程

什么是协程&#xff1f; 协程不是计算机系统提供&#xff0c;程序员人为创造。 协程也可以被称为微线程&#xff0c;是一种用户态内的上下文切换技术。简而言之&#xff0c;其实就是通过一个线程实现代码块相互切换执行。 实现协程有那么几种方法&#xff1a; greenlet&…

Centos怎么执行脚本

方法一&#xff1a;切换到shell脚本所在的目录&#xff08;此时&#xff0c;称为工作目录&#xff09;执行shell脚本 cd /data/shell ./hello.sh 方法二&#xff1a;以绝对路径的方式去执行bash shell脚本 /data/shell/hello.sh 方法三&#xff1a;直接使用bash 或sh 来执行…

CSS外边距

元素的外边距&#xff08;margin&#xff09;是围绕在元素边框以外&#xff08;不包括边框&#xff09;的空白区域&#xff0c;这片区域不受 background 属性的影响&#xff0c;始终是透明的。 为元素设置外边距 默认情况下如果不设置外边距属性&#xff0c;HTML 元素就是不会…

Linux shell编程学习笔记84:tee命令——显示保存两不误

0 引言 在前面的学习笔记中&#xff0c;我们经常使用echo命令和输出重定向来生成脚本文件或演示文件&#xff0c;其实Linux提供了一个可以从标准输入读取数据&#xff0c;并输出成文件的命令——tee。 1 tee命令 的帮助信息、功能、命令格式、选项和参数说明 1.1 tee命令 的…

软件测试学习笔记丨Pytest 学习指南

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32336 基本介绍 pytest框架是一个成熟&#xff0c;全面的测试框架&#xff0c;具有非常丰富的第三方插件&#xff0c;并且可以自定义扩展 比如&#xff1a;pytest-selenium , pytest-html ,…

MySQL高阶2004-职员招聘人数

目录 题目 准备数据 分析数据 实现 题目 一家公司想雇佣新员工。公司的工资预算是 70000 美元。公司的招聘标准是&#xff1a; 雇佣最多的高级员工。在雇佣最多的高级员工后&#xff0c;使用剩余预算雇佣最多的初级员工。 编写一个SQL查询&#xff0c;查找根据上述标准雇…

net core mvc 数据绑定 《1》

其它的绑定 跟net mvc 一样 》》MVC core 、framework 一样 1 模型绑定数组类型 2 模型绑定集合类型 3 模型绑定复杂的集合类型 4 模型绑定源 》》》》 模型绑定 使用输入数据的原生请求集合是可以工作的【request[],Querystring,request.from[]】&#xff0c; 但是从可读…