数据结构:二叉树(3):相关oj题目

news2024/12/25 13:32:09

二叉树oj题的续

目录

102. 二叉树的层序遍历 - 力扣(LeetCode)

236. 二叉树的最近公共祖先 - 力扣(LeetCode)

方法1

方法2

105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)

106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

606. 根据二叉树创建字符串 - 力扣(LeetCode)

144. 二叉树的前序遍历 - 力扣(LeetCode)

非递归的后序遍历


​​​​​​​102. 二叉树的层序遍历 - 力扣(LeetCode)

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000

-------------------------------------------------------------------------------------------------------------------------------- 

先不看题目,我们自己在本地模拟一个层序遍历出来 

层序遍历:从上到下,从左到右遍历

从上到下遍历:前序/中序/后序

从左到右遍历:使用队列,把根结点放进队列,出队列;然后把左右子树也放进去,依次出队列

设置一个cur来遍历队列,这个cur = 出队列的元素,出完队列后把这个cur(也就是刚出队列的元素)的左右子树加入队列

    void levelOrder(TreeNode root){
        if(root == null){
            return ;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            TreeNode cur = queue.poll();
            System.out.println(cur.val + " ");

            if(cur.left != null){
                queue.offer(cur.left);
            }
            if(cur.right!= null){
                queue.offer(cur.right);
            }
        }
    }

---------------------------------------------------------------------------------------------------------------------------------

🆗我们回到题目上来,题目给的函数要求我们返回一个二维数组

问题来了,如何存储每一层的结点到list当中?如何确定一层中有多少个结点?

我们可以定义一个size来记录整个队列的大小,创建一个tmp数组。(这俩是全局变量)

设置一个循环(循环条件是size!=0),每次弹出cur位置的元素后把这个元素放到tmp数组里面,size再--

然后把cur左子树和右子树加进队列

上面定义的size是全局变量,所以在循环里面,就算你把左右子树入队,在size没有--到0的时候是不会退出循环的,所以不用担心加入新元素会导致死循环的情况

🆗每一层列表创建完后,把所有的列表扔到ret列表里面

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> ret = new ArrayList<>();
        if(root == null){
            return ret;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
          int size = queue.size();
          List<Integer> tmp = new ArrayList<>();
          while(size != 0){
            TreeNode cur = queue.poll();
            tmp.add(cur.val);
            size--;
            if(cur.left != null){
                queue.offer(cur.left);
            }
            if(cur.right!= null){
                queue.offer(cur.right);
            }
          }
          ret.add(tmp);
        }
        return ret;
    }
}

 


利用层序遍历思想来判断一棵树是不是完全二叉树

 当把队列里面弹出null后整个队列里面都是null,说明这棵树是一颗完全二叉树

 如果不是一棵完全二叉树的话会出现这样的情况

弹出null之后队列里面还有元素G

    boolean isCompleteTree(TreeNode root){
        if(root == null){
            return true;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);

        while(!queue.isEmpty()){
            TreeNode cur = queue.poll();
            if(cur!=null){
                queue.offer(cur.left);
                queue.offer(cur.right);
            }else{
                break;//结束循环
            }
        }
        //代码走到这是把元素都入队了,包括null
        //需要判断队列中是否有空的元素
        while(!queue.isEmpty()){
            //一个元素一个元素出队来判断是不是空
            //把null弹出,如果遇到不是null的元素就返回错误
            TreeNode tmp = queue.peek();
            if(tmp == null){
                queue.poll();
            }else{
                return false;
            }
        }
        return true;
    }

236. 二叉树的最近公共祖先 - 力扣(LeetCode)

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

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

示例 1:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点5和节点1的最近公共祖先是节点 3

示例 2:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点5和节点4的最近公共祖先是节点5。
因为根据定义最近公共祖先节点可以为节点本身。

示例 3:

输入:root = [1,2], p = 1, q = 2
输出:1

提示:

  • 树中节点数目在范围 [2, 105] 内。
  • -109 <= Node.val <= 109
  • 所有 Node.val 互不相同 。
  • p != q
  • p 和 q 均存在于给定的二叉树中。

方法1

 分为三种情况

情况1

情况2 

 情况3

root遍历这棵树,遇到p或者q就返回

如果两边的返回都不为空,root就是最近公共祖先

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null){
            return root;
        }
        //情况1
        if(root == p || root == q){
            return root;
        }
        TreeNode leftTree = lowestCommonAncestor(root.left,p,q);
        TreeNode rightTree = lowestCommonAncestor(root.right,p,q);
        //情况2
        if(leftTree != null && rightTree != null){
            return root;
        //情况3
        }else if(leftTree != null){
            return leftTree;
        }else{
            return rightTree;
        }
    }

---------------------------------------------------------------------------------------------------------------------------------

方法2

假设p = 6,q等于4,从自身出发往根结点方向遍历,遍历到相同的结点就是最近公共祖先

其实相当于求链表的交点

我们把p和q的父结点(包括自己)全部拿出来,分别放到两个里面

长度不一样就先把长的栈里面先拿出元素直到两个栈等长,然后每次各自拿出一个元素进行比较,不同继续拿,相同了就终止并返回最后拿出来的元素 

现在问题来了:如何存储从根结点到p或者q的路径上的所有结点,还有如何找到p和q?

我们使用一个函数getPath(root,node,stack),每次遍历到一个结点就把这个结点扔到栈里面

如果遍历到root = node,就返回true

判断如果左树没有结点,右树没有结点,则当前的root就不是路径上的结点,我们返回false并把这个root元素从栈中弹出

    private boolean getPath(TreeNode root, TreeNode node, Stack<TreeNode> stack){
        if(root == null || node == null){
            return false;
        }
        stack.push(root);
        if(root == node){
            return true;
        }
        //判断左子树有没有结点
        boolean flg = getPath(root.left, node, stack);
        if(flg == true){
            return true;
        }
        //判断右子树有没有结点
        boolean flg2 = getPath(root.right, node, stack);
        if(flg2 == true){
            return true;
        }
        //都没有结点就把root元素弹出来并返回false退到这个root的父结点
        stack.pop();
        return false;
    } 
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null) return null;
        
        Stack<TreeNode> stackP = new Stack<>();
        Stack<TreeNode> stackQ = new Stack<>();

        getPath(root,p,stackP);
        getPath(root,q,stackQ);

        int sizep = stackP.size();
        int sizeq = stackQ.size();

        if(sizep > sizeq){
            int size = sizep - sizeq;
            while(size != 0){
                stackP.pop();
                size--;
            }
        }else{
            int size = sizeq - sizep;
            while(size != 0){
                stackQ.pop();
                size--;
            }
        }
        //走到这,两个栈当中元素一样多
        //接下来判断两个栈的栈顶元素一不一样,一样就返回,不一样就分别弹出
        while(!stackP.isEmpty() && !stackQ.isEmpty()){
            if(stackP.peek() == stackQ.peek()){
                return stackP.peek();
            }else{
                stackP.pop();
                stackQ.pop();
            }
        }
        return null;
    }

105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)

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

示例 1:

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

示例 2:

输入: preorder = [-1], inorder = [-1]
输出: [-1]

前序遍历:根,左,右

    private TreeNode buildTreeChild(int[] preorder, int preIndex, 
int[] inorder, int inbegin, int inend){
        TreeNode root = new TreeNode(preorder[preIndex]);

        //找到根结点在中序遍历中的位置
        int rootIndex = findIndexRoot(inorder,inbegin,inend,preorder[preIndex]);

        preIndex++;
        root.left = buildTreeChild(preorder,preIndex,inorder,inbegin,rootIndex-1);
        root.left = buildTreeChild(preorder,preIndex,inorder,rootIndex+1,inend);

        return root;
    }
    private int findIndexRoot(int[] inorder, int inbegin, int inend, int key){
        //这里的<=是因为inend = rootIndex - 1
        for(int i = inbegin; i<=inend;i++){
            if(inorder[i] == key){
                return i;
            }
        }
        return -1;
    }

第一个问题:什么时候退出循环呢?

我们分析一下

拿左子树举例,当preindex遍历到H结点的时候,ie的值为-1,这不被我们允许,所以我们规定inbegin>inend时就返回空

第二个问题:preIndex是一个局部变量,当我们找到结点左右的树为空时,我们要回去上一个结点,当返回到E结点时,preIndex其实等于1,它到不了4

那就在上面把preIndex定义成全局变量

class Solution {
    public int preIndex ;
    public TreeNode buildTree(int[] preorder, int[] inorder) {

        return buildTreeChilde(preorder,inorder,0,inorder.length-1);

    }

    private TreeNode buildTreeChilde(int[] preorder,int[] inorder,int inbegin,int inend) {

        if(inbegin > inend) {
            return null;//没有 左树 或者 没有 右树 
        }

        TreeNode root = new TreeNode(preorder[preIndex]);

        int rootIndex = findIndexRoot(inorder,inbegin,inend,preorder[preIndex]);
        if(rootIndex == -1) {
            return null;
        }

        preIndex++;

        root.left = buildTreeChilde(preorder,inorder,inbegin,rootIndex-1);

        root.right = buildTreeChilde(preorder,inorder,rootIndex+1,inend);
        
        return root;

    }

    private int findIndexRoot(int[] inorder,int inbegin, int inend,int key) {

        for(int i = inbegin; i <= inend;i++) {
            if(inorder[i] == key) {
                return i;
            }
        }
        return -1;
    }

}


106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]

示例 2: 

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

 

跟前序遍历相反,后序遍历我们把postIndex放到最后一个元素,往前遍历,因为后序遍历最后一个元素就是根结点

问题:先创建左树还是先创建右树?

答案是先创建右树,因为pi往前遍历的结点就在整个树的右树里面

跟上面的题目差不多,就是遍历方式不一样而已

class Solution {
    public int postIndex ;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        postIndex = postorder.length-1;//注意这一行代码的定义
        return buildTreeChilde(postorder,inorder,0,inorder.length-1);
    }

    private TreeNode buildTreeChilde(int[] postorder,int[] inorder,int inbegin,int inend) {

        if(inbegin > inend) {
            return null;//没有 左树 或者 没有 右树 
        }

        TreeNode root = new TreeNode(postorder[postIndex]);

        int rootIndex = findIndexRoot(inorder,inbegin,inend,postorder[postIndex]);
        if(rootIndex == -1) {
            return null;
        }

        postIndex--;
        root.right = buildTreeChilde(postorder,inorder,rootIndex+1,inend);
        root.left = buildTreeChilde(postorder,inorder,inbegin,rootIndex-1);

        return root;
    }

    private int findIndexRoot(int[] inorder,int inbegin, int inend,int key) {

        for(int i = inbegin; i <= inend;i++) {
            if(inorder[i] == key) {
                return i;
            }
        }
        return -1;
    }
    
}

606. 根据二叉树创建字符串 - 力扣(LeetCode)

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

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

示例 1:

输入:root = [1,2,3,4]
输出:"1(2(4))(3)"
解释:初步转化后得到 "1(2(4)())(3()())" ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)" 。

示例 2:

输入:root = [1,2,3,null,4]
输出:"1(2()(4))(3)"
解释:和第一个示例类似,但是无法省略第一个空括号对,否则会破坏输入与输出一一映射的关系。

 

1.根结点直接拼接

2.左边为空并且右边为空的时候什么都不做

3.左边不为空,右边为空

 

4.左边为空,右边不为空,直接加上一对小括号 

class Solution {
    public String tree2str(TreeNode root) {
        StringBuilder stringBuilder = new StringBuilder();
        tree2strchild(root,stringBuilder);
        return stringBuilder.toString();
    }
    private void tree2strchild(TreeNode t, StringBuilder stringBuilder){
        if(t == null){
            return ;
        }
        stringBuilder.append(t.val);
        if(t.left != null){
            stringBuilder.append("(");
            tree2strchild(t.left,stringBuilder);
            //遍历到左树为空的时候返回并加上右括号,证明左树已经遍历完了
            stringBuilder.append(")");
        }else{
            //左边为空右边也为空,什么都不做
            if(t.right == null){
                return ;
            //左边为空右边不为空,直接加()
            }else{
                stringBuilder.append("()");
            }
        }
        //判断右树
        if(t.right != null){
            stringBuilder.append("(");
            tree2strchild(t.right,stringBuilder);
            //遍历到右树为空的时候返回并加上右括号,证明右树已经遍历完了
            stringBuilder.append(")");
        }else{
            return;
        }
    }
}


144. 二叉树的前序遍历 - 力扣(LeetCode)

是不是看着很眼熟,我们之前写的前序遍历是采用递归方法,现在这道题我们采用非递归的方法来做

设置一个栈和一个用来遍历的cur,当cur遍历一个元素就加入到栈中,先遍历左子树

继续往下遍历,D左右子树空了,就把D弹出来,交给一个top的变量,cur移到D的右边

D的右边为空,返回B。弹出B,cur遍历到B的右边

注意要先弹出元素cur才能遍历到该元素的右边

    void preOrderNor(TreeNode root){
        if(root == null) {
            return;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while (cur != null || !stack.isEmpty()) {
            while (cur != null) {
                stack.push(cur);
                //前序遍历先打印根
                System.out.print(cur.val + " ");
                cur = cur.left;
            }
            TreeNode top = stack.pop();
            cur = top.right;
        }
    }

顺带扯一下中序遍历

1.cur一直往左走,遇到空停止,如果左树走完了就弹出栈顶元素并且打印

2.遍历弹出结点的右子树

    void inOrderNor(TreeNode root){
        if(root == null) {
            return;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while (cur != null || !stack.isEmpty()) {
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            //这里得先弹出元素再打印
            TreeNode top = stack.pop();
            System.out.print(top.val + " ");
            cur = top.right;
        }
    }

非递归的后序遍历

第一步:设置cur遍历左子树,把遍历到的元素放入栈中,但不要打印(因为要遍历完右子树才能打印根)

    void postOrderNor(TreeNode root){
        if(root == null) {
            return;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while (cur != null) {
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
        }
    }

第二步:打印D的右子树,我们可以定义一个top先暂时存储此时的栈顶元素D,让cur移到top这里

分成两种情况  ==null 弹出D并打印D

!= null cur就往D的右边走

        while(cur != null){
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
        
            TreeNode top = stack.peek();
            if(top.right == null){
                System.out.println(top.val);
                stack.pop();
            }else{
                cur = top.right;
            }
        }

现在问题来了,假设D左边有一个元素K,把K弹出并打印之后

cur为空,进不了第一个循环,进入top定义语句,找到top = D,再往下走

此时D的右边是K,依旧不为空,又把K弹出来又打印了一遍,这样就陷入了死循环了

那我们可以加入一个prev来记录最新被打印的结点,与此同时,判断top.right == prev

整个代码:

    void postOrderNor(TreeNode root){
        if(root == null) {
            return;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        
        TreeNode prev = null;
        while(cur != null || !stack.isEmpty()){
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }

            TreeNode top = stack.peek();
            if(top.right == null || top.right == prev){
                System.out.println(top.val + " ");
                stack.pop();
                prev = top;
            }else{
                cur = top.right;
            }
        }
    }

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

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

相关文章

图论03-【无权无向】-图的深度优先DFS遍历-路径问题/检测环/二分图

文章目录 1. 代码仓库2. 单源路径2.1 思路2.2 主要代码 3. 所有点对路径3.1 思路3.2 主要代码 4. 路径问题的优化-提前结束递归4.1 思路4.2 主要代码 5. 检测环5.1 思路5.2 主要代码 6. 二分图6.1 思路6.2 主要代码6.2.1 遍历每个联通分量6.2.2 递归判断相邻两点的颜色是否一致…

java--Consumer的使用

一、目的 因为代码中用到了Consumer &#xff0c;所以特地来梳理其对应的用法以及总结。 二、介绍 Consumer 是一个函数式接口&#xff0c;它位于java.util.function 包中&#xff0c;它定义了一个名为accept 的抽象方法&#xff0c;该方法接受一个参数并且不返回任何结果。 …

【C++和数据结构】模拟实现哈希表和unordered_set与unordered_map

目录 一、哈希的概念与方法 1、哈希概念 2、常用的两个哈希函数 二、闭散列的实现 1、基本结构&#xff1a; 2、两种增容思路 和 插入 闭散列的增容&#xff1a; 哈希表的插入&#xff1a; 3、查找 4、删除 三、开散列的实现 1、基本结构 2、仿函数Hash 3、迭代器…

sealos 部署halo

首先创建数据库 postgresql 找到连接数据库&#xff0c;点击详情查看数据库的参数 部署halo应用 halohub/halo:2.5 高级配置里设置环境变量 本地存储 配置 Halo 环境变量环境变量 spring.sql.init.platformpostgresql spring.r2dbc.urlr2dbc:pool:postgresql://postgres:4w…

在 Python 中使用 Pillow 进行图像处理【3/4】

第三部分 一、腐蚀和膨胀 您可以查看名为 的图像文件dot_and_hole.jpg&#xff0c;您可以从本教程链接的存储库中下载该文件&#xff1a; 该二值图像的左侧显示黑色背景上的白点&#xff0c;而右侧显示纯白色部分中的黑洞。 侵蚀是从图像边界去除白色像素的过程。您可以通过使用…

运算符重载的三种实现方法

一、重载为一般函数 格式&#xff1a;返回类型 operator 运算符(参数列表) struct Complex{//定义一个复数结构&#xff1a;包括实部与虚部两部分 double real;//实部 double imag;//虚部 }; Complex operator(Complex c1,Complex c2){//对加法运算的重载&#xff1a;将运算符…

扩展字符串(acwing周赛第三题)

代码&#xff1a; #include <bits/stdc.h> using namespace std; typedef long long LL; const int N 1e510; const LL INF 2e18; LL len[N];string s"DKER EPH VOS GOLNJ ER RKH HNG OI RKH UOPMGB CPH VOS FSQVB DLMM VOS QETH SQB"; string a"DKER …

2023全新小程序广告流量主奖励发放系统源码 流量变现系统

2023全新小程序广告流量主奖励发放系统源码 流量变现系统 分享软件&#xff0c;吃瓜视频&#xff0c;或其他资源内容&#xff0c;通过用户付费买会员来变现&#xff0c;用户需要付费&#xff0c;有些人喜欢白嫖&#xff0c;所以会流失一部分用户&#xff0c;所以就写了这个系统…

TCP--滑动窗口

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家来访。 接收端和发送端通过窗口来实现流量的控制。发送端维护一个发送窗口&#xff0c;接收端维护一个…

Selenium获取百度百科旅游景点的InfoBox消息盒

前面我讲述过如何通过BeautifulSoup获取维基百科的消息盒&#xff0c;同样可以通过Spider获取网站内容&#xff0c;最近学习了SeleniumPhantomjs后&#xff0c;准备利用它们获取百度百科的旅游景点消息盒&#xff08;InfoBox&#xff09;&#xff0c;这也是毕业设计实体对齐和属…

邻接表存储图或者树

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家来访。 介绍 每个顶点都作为头节点&#xff0c;并且存在一个一维数组中h[N]。树就是相当于一种有向图…

进阶高级,接口+接口自动化测试疑难解答,一篇带你策底打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、你们做接口测试…

MapReduce编程:join操作和聚合操作

文章目录 MapReduce 编程&#xff1a;join操作和聚合操作一、实验目标二、实验要求及注意事项三、实验内容及步骤 附&#xff1a;系列文章 MapReduce 编程&#xff1a;join操作和聚合操作 一、实验目标 理解MapReduce计算框架的分布式处理工作流程掌握用mapreduce计算框架实现…

python调用astra进行人脸检测(使用CascadeClassifier)

1、简述 方法&#xff1a;使用opecv中&#xff0c;CascadeClassifier 级联分类器实现人脸检测&#xff0c;CascadeClassifier就是opencv下objdetect模块中用来做目标检测的级联分类器的一个类&#xff0c;它可以帮助我们检测例如车牌、眼睛、人脸等物体。它的大概原理就是判别…

C++17中std::string_view的使用

为了解决std::string初始化(或拷贝)成本高昂的问题&#xff0c;C17引入了std::string_view。std::string_view提供对现有字符串(C风格字符串、std::string、或另一个std::string_view)的只读访问&#xff0c;而无需进行拷贝。当想要有效地处理和操作字符串而不修改它们时&#…

用python计算积分

先安装这个包 pip install scipy运行 import tkinter as tk from scipy.integrate import quad# 创建主窗口 root tk.Tk() root.title("积分计算器")# 定义计算积分的函数 def calculate_integral():# 获取用户输入的函数表达式function function_entry.get()# 获…

2023年最全的外贸建站新手教程

凡做外贸的&#xff0c;我相信在过去几年中通过亚马逊、速卖通等电商平台上都取得了一定的成功。然而&#xff0c;近年来电商平台上的竞争激烈&#xff0c;利润空间有限&#xff0c;流量获取困难和昂贵&#xff0c;这对许多外贸从业者造成了困扰。因此&#xff0c;为了减少对平…

分析概览 文章管理 草稿管理 图片管理 站点管理 主站 关于 登出 手写操作系统项目----进程

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家来访。 这里记录了&#xff0c;手写操作系统项目中关于进程的部分。 进程四要素 首先进程有四要素。 …

golang 八股文整理

目录 进程、线程、协程Go 的垃圾回收机制GC 的触发条件GC 的调优GMP 调度和 CSP 模型Goroutine 的调度原理Goroutine 的切换时机Context 结构原理Context 工作原理Context 使用场景Golang 的内存分配机制竞态问题内存逃逸golang 内存对齐机制golang 中 new 和 make 的区别&…

数二思维导图

高数上 第一章&#xff1a;函数、极限、连续 函数 函数的单调性、周期性、奇偶性复合函数 极限 求直接代入型的极限求∞∞型的极限用等价无穷小代换求00型的极限用洛必达法则求00型或∞∞型的极限求∞•0型的极限求幂指函数的极限函数的左右极限及需要求左右极限的情形极限的…