【Java数据结构】二叉树详解(四)

news2024/11/16 3:42:53

🔒文章目录:

1.❤️❤️前言~🥳🎉🎉🎉

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

2.1第一种思路 

2.2第二种思路  

3.根据一棵树的前序遍历与中序遍历构造二叉树 

4.根据一棵树的中序遍历与后序遍历构造二叉树 

5.二叉树创建字符串

6.二叉树非递归实现前序遍历

 7.二叉树非递归实现中序遍历

8.二叉树非递归实现后序遍历

9.总结


1.❤️❤️前言~🥳🎉🎉🎉

Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。

如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的内容感兴趣,记得关注我👀👀以便不错过每一篇精彩。

当然,如果在阅读中发现任何问题或疑问,我非常欢迎你在评论区留言指正🗨️🗨️。让我们共同努力,一起进步!

加油,一起CHIN UP!💪💪

🔗个人主页:E绵绵的博客
📚所属专栏:

1. JAVA知识点专栏

        深入探索JAVA的核心概念与技术细节

2.JAVA题目练习

        实战演练,巩固JAVA编程技能

3.c语言知识点专栏

        揭示c语言的底层逻辑与高级特性

4.c语言题目练习

        挑战自我,提升c语言编程能力

📘 持续更新中,敬请期待❤️❤️

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

 📌题目描述 

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

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


2.1第一种思路 

📋题目思路 

  1. 首先,检查根节点是否为null,如果是,则返回null。这是递归算法的基本情况之一,用于处理空树的情况。

  2. 接下来,检查根节点是否等于其中一个指定节点,如果是,则返回根节点。这是另一个基本情况,处理了当根节点就是目标节点之一的情况。

  3. 然后,分别递归地在左子树和右子树中寻找指定节点的最近公共祖先,并将结果存储在left和right变量中。

  4. 如果左右子树中都找到了指定节点,则说明当前根节点就是这两个节点的最近公共祖先,返回当前根节点。

  5. 如果只有一个子树找到了指定节点,那么这个子树的返回值就是这两个节点的最近公共祖先,返回该子树的返回值。

  6. 如果左右子树都没有找到指定节点,则返回null。

这个算法是一个递归算法,通过深度优先搜索遍历整个树从而查找最近公共祖先。

⏳题目代码  

 // 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
            public BTNode lowestCommonAncestor(BTNode root, BTNode p, BTNode q) {
                      if(root==null)
                          return null;
                      if(root==p||root==q)
                          return  root;
                      BTNode left=lowestCommonAncestor(root.left,p,q);
                      BTNode right=lowestCommonAncestor(root.right,p,q);
                      if(left!=null&&right!=null)
                          return  root;
                      if(left==null&&right!=null)
                          return  right;
                      if(left!=null&&right==null)
                          return  left;
                      if(left==null&&right==null)
                          return  null;

                      return  null;
            }

2.2第二种思路  

📋题目思路  

  1. 首先定义了一个lowestCommonAncestor方法,接收三个参数:根节点root,和两个指定节点pq

  2. 创建了两个Stack对象,stack1stack2,用于分别存储从根节点到指定节点pq的路径。

  3. 调用getStack方法分别获取从根节点到pq的路径,并将路径存储在stack1stack2中。

  4. 如果两条路径都成功获取,则进入后续处理。

  5. 获取到路径后,计算两个栈的大小,并确保它们在最后一个共同节点处相等。如果不相等,则将较长的栈中的节点出栈,直到两个栈的大小相等为止。

  6. 然后,同时从两个栈中弹出元素,直到找到最后一个相同的节点。这个节点就是最近的公共祖先。

  7. 如果没有找到共同节点,返回null。

  8. getStack方法中,也是一个递归方法,用于获取从根节点到指定节点的路径。它接收一个栈对象、根节点和目标节点作为参数。

  9. 如果根节点为null,返回false。

  10. 将当前节点加入栈中。

  11. 如果当前节点是目标节点,则返回true。

  12. 否则,递归地在左子树和右子树中查找目标节点。如果找到目标节点,则直接退出该方法且返回true。否则将栈顶元素弹出,并返回false。

我们这第二种思路利用栈和递归去解决问题的,比第一种思路要相对复杂点。

 ⏳题目代码  

   public BTNode lowestCommonAncestor(BTNode root, BTNode p, BTNode q) {
        Stack<BTNode> stack1=new Stack<>();
        Stack<BTNode> stack2=new Stack<>();
         if (getStack(stack1,root,p)&&getStack(stack2,root,q)){
             int a= stack1.size();
             int b= stack2.size();
            while(a!=b){
                if(a>b) {
                    stack1.pop();
                    a--;
                }
                else{
                    stack2.pop();
                    b--;
            }}
            while(!stack1.isEmpty()){
                if(stack1.peek()==stack2.peek())
                    return  stack1.peek();
                else
                    stack1.pop();
                    stack2.pop();
            }
                 return  null;
         }

         return  null;
    }

     public boolean getStack(Stack<BTNode> stack,BTNode root,BTNode p){
                  if(root==null)
                    return false;
              stack.push(root);
                 if (root==p)
                  return true;
              if(!(getStack(stack,root.left,p)||getStack(stack,root.right,p))) {
                  stack.pop();
                  return false;
              }
              return true;
     }

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


3.根据一棵树的前序遍历与中序遍历构造二叉树 

 📌题目描述 

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


 📋题目思路 

我们需要实现一个构建二叉树的方法 buildTree,根据给定的先序遍历数组 preorder 和中序遍历数组 inorder,返回构建的二叉树的根节点。其中,通过静态内部类 TreeNode 来表示二叉树的每个节点,每个节点有一个值 value 和两个指向左右子树的 left、right 指针。

具体实现思路是:先序遍历数组 preorder 的第一个元素为当前根节点,然后在中序遍历数组 inorder 中找到该根节点的位置,从而确定左右子树的范围。而后通过递归方式依次构建左右子树,并返回当前节点,最终返回整棵二叉树的根节点。

其中,我们还要有getIndex 方法用于在中序遍历数组中查找指定值的位置,还需要通过设置成员变量i去遍历先序数组中的元素。

 ⏳题目代码 

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

    static class TreeNode {
        int value;
        TreeNode left;
        TreeNode right;

        public TreeNode(int value) {
            this.value = value;
        }
    }

    public TreeNode buildTree(int[] preorder, int[] inorder) {
         return    build(preorder,inorder,0,inorder.length-1);
    }

    public int getIndex(int[] inorder,int value,int began,int end){
        for (int j = began; j <=end ; j++) {
            if(inorder[j]==value)
                return  j;
        }
        return  -1;
    }
    public  TreeNode  build(int[] preorder,int[] inorder,int began,int end) {
        if(began>end)
            return  null;
        TreeNode treeNode = new TreeNode(preorder[i]);
        int index = getIndex(inorder, preorder[i], began,end);
        i++;
        treeNode.left = build(preorder,inorder,began,index-1);
        treeNode.right=build(preorder,inorder,index+1,end);
        return  treeNode;
    }


}

该题链接:根据一棵树的前序遍历与中序遍历构造二叉树 


4.根据一棵树的中序遍历与后序遍历构造二叉树 

 📌题目描述 

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。


 📋题目思路  

跟我们上一题思路差不多

我们需要实现一个构建二叉树的方法 buildTree,根据给定的后序遍历数组 postorder 和中序遍历数组 inorder,返回构建的二叉树的根节点。其中,通过静态内部类 TreeNode 来表示二叉树的每个节点,每个节点有一个值 value 和两个指向左右子树的 left、right 指针。

具体实现思路是:后序遍历数组 postorder 的最后一个元素为当前根节点,然后在中序遍历数组 inorder 中找到该根节点的位置,从而确定左右子树的范围。而后通过递归方式依次构建左右子树,并返回当前节点,最终返回整棵二叉树的根节点。

 ⏳题目代码 

//给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,
// 请你构造并返回这颗 二叉树 。
public class Test4 {
    public int i;

    static class TreeNode {
        int value;
       TreeNode left;
       TreeNode right;

        public TreeNode(int value) {
            this.value = value;
        }
    }
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        i=postorder.length-1;
        return    build(postorder,inorder,0,inorder.length-1);
    }

    public int getIndex(int[] inorder,int value,int began,int end){
        for (int j = began; j <=end ; j++) {
            if(inorder[j]==value)
                return  j;
        }
        return  -1;
    }
    public TreeNode build(int[] preorder, int[] inorder, int began, int end) {
        if(began>end)
            return  null;
        TreeNode treeNode = new TreeNode(preorder[i]);
        int index = getIndex(inorder, preorder[i], began,end);
        i--;
        treeNode.right = build(preorder,inorder,index+1,end);
        treeNode.left=build(preorder,inorder,began,index-1);
        return  treeNode;
    }


}

 该题链接:根据一棵树的中序遍历与后序遍历构造二叉树 


5.二叉树创建字符串

📌题目描述 

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

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


  📋题目思路  

  1. 定义了一个Solution1类,其中包含了一个静态内部类TreeNode,用于表示二叉树的节点。

  2. tree2str方法是转换函数的入口,接收一个根节点root,返回转换后的字符串。

  3. 创建了一个StringBuilder对象stringBuilder,用于拼接转换后的字符串。

  4. 如果根节点为null,直接返回空字符串。

  5. 将根节点的值添加到stringBuilder中。

  6. 调用getString方法来递归构建字符串。

  7. getString方法是递归构建字符串的核心方法,接收一个StringBuilder对象和当前节点作为参数。

  8. 如果当前节点的左右子节点都为空,说明当前节点是叶子节点,直接返回。

  9. 根据当前节点的左右子节点情况,按照题目要求构建字符串:

    • 如果左子节点为空而右子节点不为空,则添加"()"和右子节点的值。
    • 如果右子节点为空而左子节点不为空,则添加左子节点的值。
    • 如果左右子节点都不为空,则添加左子节点的值和右子节点的值。
  10. 继续递归调用getString方法处理左右子节点。

  11. 最后返回构建好的字符串。

 ⏳题目代码 

//给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。
class Solution1 {
    static class TreeNode {
        int value;
        TreeNode left;
        TreeNode right;

        public  TreeNode(int value) {
            this.value = value;
        }
    }
    public String tree2str(TreeNode root) {
        StringBuilder stringBuilder=new StringBuilder();
              if(root==null)
            return  stringBuilder.toString();
            stringBuilder.append(root.value);
           getString (stringBuilder,root);
          return   stringBuilder.toString();
    }
    public void getString(StringBuilder stringBuilder,TreeNode root){
        if(root.left==null&&root.right==null)
            return  ;

            if(root.left==null&&root.right!=null) {
                stringBuilder.append("()");
                stringBuilder.append("(");
                stringBuilder.append(root.right.value);
                getString(stringBuilder,root.right);
                stringBuilder.append(")");
            }
            if(root.left!=null&&root.right==null){
                stringBuilder.append("(");
                stringBuilder.append(root.left.value);
                getString(stringBuilder,root.left);
                stringBuilder.append(")");
            }
            if(root.left!=null&&root.right!=null){
                stringBuilder.append("(");
                stringBuilder.append(root.left.value);
                getString(stringBuilder,root.left);
                stringBuilder.append(")");
                stringBuilder.append("(");
                stringBuilder.append(root.right.value);
                getString(stringBuilder,root.right);
                stringBuilder.append(")");
            }
    }


}

该题链接:二叉树创建字符串 


6.二叉树非递归实现前序遍历

📌题目描述 

用非递归的方式(循环方式)实现前序遍历

 📋题目思路  

  1. 定义了一个preorderTraversal方法,接收一个根节点root,返回树的前序遍历结果。

  2. 创建了一个ArrayList对象list,用于存储遍历结果。

  3. 创建了一个Stack对象stack,用于辅助遍历。

  4. 如果根节点为null,直接返回空的遍历结果列表。

  5. 进入循环,直到根节点为null并且栈为空为止。

  6. 内部循环:在每次循环中,将当前节点的值加入到遍历结果列表中,并将当前节点入栈。然后,沿着左子树一直向下遍历,直到遇到没有左子节点的节点为止。

  7. 一旦当前节点的左子树遍历完成,将当前节点出栈,并将当前节点指向其右子节点。

  8. 重复步骤6和7,直到遍历完成。

  9. 返回遍历结果列表。

 ⏳题目代码

   public List<Integer> preorderTraversal(BTNode root) {
                  List<Integer> list=new ArrayList<>();
                      Stack<BTNode> stack=new Stack<>();
                      if(root==null)
                          return list;
                      while(root!=null||!stack.isEmpty()){
                       while(root!=null){
                        list.add(root.value);
                        stack.push(root);
                        root=root.left;
                    }
                  root= stack.pop().right;
           }
                      return list;
        }

 该题链接:二叉树非递归实现前序遍历


 7.二叉树非递归实现中序遍历

📌题目描述 

用非递归的方式(循环方式)实现中序遍历

  📋题目思路  

  1. 定义了一个inorderTraversal方法,接收一个根节点root,返回树的中序遍历结果。

  2. 创建了一个ArrayList对象list,用于存储遍历结果。

  3. 创建了一个Stack对象stack,用于辅助遍历。

  4. 如果根节点为null,直接返回空的遍历结果列表。

  5. 进入循环,直到根节点为null并且栈为空为止。

  6. 内部循环:在每次循环中,将当前节点的所有左子节点入栈,直到当前节点为空。

  7. 出栈一个节点,并将其右子节点作为当前节点。

  8. 将出栈节点的值添加到遍历结果列表中。

  9. 重复步骤6到8,直到遍历完成。

  10. 返回遍历结果列表。

  ⏳题目代码

public List<Integer> inorderTraversal(BTNode root) {
        List<Integer> list=new ArrayList<>();
        Stack<BTNode> stack=new Stack<>();
          if(root==null)
              return list;
          while(root!=null||!stack.isEmpty()){
              while (root!=null){
                  stack.push(root);
                  root=root.left;
              }
               BTNode btNode=stack.pop();
              root=btNode.right;
              list.add(btNode.value);
          }
          return list;
    }

该题链接 :二叉树非递归实现中序遍历


8.二叉树非递归实现后序遍历

📌题目描述 

用非递归的方式(循环方式)实现后序遍历

 📋题目思路  

  1. 定义了一个postorderTraversal方法,接收一个根节点root,返回树的后序遍历结果。

  2. 创建了一个ArrayList对象list,用于存储遍历结果。

  3. 创建了一个Stack对象stack,用于辅助遍历。

  4. 如果根节点为null,直接返回空的遍历结果列表。

  5. 进入循环,直到根节点为null并且栈为空为止。

  6. 内部循环:在每次循环中,将当前节点的所有左子节点入栈,直到当前节点为空。

  7. 在每次内部循环结束后,通过stack.peek()获取当前栈顶节点,将其赋值给btNode

  8. 定义prev节点,初始化为当前栈顶节点。

  9. root指向btNode的右子节点。

  10. 如果root为null,说明当前节点的左右子树已经遍历完毕,将当前节点的值加入到遍历结果列表中,并将栈顶节点出栈。

  11. 检查栈是否为空,如果为空,则遍历结束,返回结果列表。

  12. 如果栈不为空,则将root重新指向栈顶节点的右子节点,然后从栈中取出节点,直到当前root节点与prev节点的右子节点不相等为止,将取出的节点加入到结果列表中。

  13. 重复步骤6到12,直到遍历完成。

  14. 返回遍历结果列表。

 ⏳题目代码

   public List<Integer> postorderTraversal(BTNode root) {
        List<Integer> list=new ArrayList<>();
        Stack<BTNode> stack=new Stack<>();
          if(root==null)
              return list;
          while (root!=null||!stack.isEmpty()){
              while(root!=null){
                  stack.push(root);
                  root=root.left;
              }
            BTNode btNode= stack.peek();
              BTNode prev=btNode;
              root=btNode.right;

              if(root==null){
                 list.add(stack.pop().value);
                 if (stack.isEmpty())
                     return list;
                 root=stack.peek().right;
                 while (root==prev){
                     prev=stack.pop();
                 list.add(prev.value);
                   if(stack.isEmpty())
                       return  list;
                 root=stack.peek().right;
                 }
          }}
          return  list;
    }


}

该题链接:二叉树非递归实现后序遍历 

9.总结 

所以我们这一篇文章就把二叉树的相关习题全讲解完了,二叉树这一章节也就全部结束了。下篇文章将会给大家带来 优先级队列(堆)的讲解。在此,我们诚挚地邀请各位大佬们为我们点赞、关注,并在评论区留下您宝贵的意见与建议。让我们共同学习,共同进步,为知识的海洋增添更多宝贵的财富!🎉🎉🎉❤️❤️💕💕🥳👏👏👏

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

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

相关文章

【Web API DOM03】事件监听

一&#xff1a;什么是事件监听 指程序检测有无某一事件发生&#xff0c;如果发生&#xff0c;就调用一个函数做出反应&#xff1b;也称为绑定事件或注册事件 比如鼠标经过显示下拉菜单、点击侧边栏播放轮播图 二&#xff1a;怎么用事件监听 1 语法规范&#xff1a; 元素对…

Python 全栈体系【四阶】(五十七)

第五章 深度学习 十三、自然语言处理&#xff08;NLP&#xff09; 2. 传统NLP处理技术 2.4 关键词提取 关键词提取是提取出代表文章重要内容的一组词&#xff0c;对文本聚类、分类、自动摘要起到重要作用。此外&#xff0c;关键词提取还能使人们便捷地浏览和获取信息。现实…

【C++进阶】深入STL之vector:深入研究迭代器失效及拷贝问题

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;初步了解vector &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀STL之vector &#x1f4d2;1. 迭…

【Java基础】线程的五大状态

新建状态 使用 new 关键字和 Thread 类或其子类建立一个线程对象后&#xff0c;该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。 就绪状态 当线程对象调用了start()方法之后&#xff0c;该线程就进入就绪状态。就绪状态的线程处于就绪队列中&#xff…

【机器学习基础】Python编程04:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些…

(学习笔记)数仓建模

数仓建模 OLAP数仓分层数据模型数据模型建设方法模型建设具体流程模型数据域事实表设计事实表拉链表 数据模型规范表命名(采用阿里one-data设计)字段命名(采用阿里one-data设计)数据模型标注规范 数据模型发展周期 OLAP OLTP&#xff1a;概念全称OnLine Transaction Processin…

【大模型】Ollama+open-webui/Anything LLM部署本地大模型构建RAG个人知识库教程(Mac)

目录 一、Ollama是什么&#xff1f; 二、如何在Mac上安装Ollama 1. 准备工作 2. 下载并安装Ollama 3. 运行Ollama 4. 安装和配置大型语言模型 5. 使用Ollama 三、安装open-webui 1. 准备工作 2. Open WebUI ⭐的主要特点 3. Docker安装OpenWebUI&#xff0c;拉去太慢…

操作系统教材第6版——个人笔记3

2.1 处理器 2.1.1 处理器与寄存器 处理器部件的简单示意 用户程序可见寄存器 可以使程序员减少访问主存储器的次数&#xff0c;提高指令执行的效率所有程序可使用&#xff0c;包括应用程序和系统程序数据寄存器&#xff1a;又称通用寄存器地址寄存器&#xff1a;索引、栈指针…

妙手ERP接入TEMU美国本土店,支持高效产品刊登、订单管理、库存管理

​​​​​​​ 众所周知&#xff0c;拼多多向来是低价卷王&#xff0c;而TEMU完美继承了拼多多的基因&#xff0c;靠着全托管模式一路狂奔&#xff0c;两年多便扩展至全球60个国家与地区&#xff0c;市场规模预计达到450亿美元&#xff0c;吸引着越来越多的卖家入驻。 在平台…

32C3-2模组与乐鑫ESP32­-C3­-WROOM­-02模组原理图、升级口说明

模组原理图&#xff1a; 底板原理图&#xff1a; u1 是AT通信口&#xff0c;wiif-tx wifi-rx 是升级口&#xff0c;chip-pu是reset复位口&#xff0c;GPIO9拉低复位进入下载模式 ESP32-WROOM-32 系列硬件连接管脚分配 功能 ESP32 开发板/模组管脚 其它设备管脚 下载固件…

Unity DOTS技术(八)状态组件

文章目录 一,简介二.实例 一,简介 因为在ECS中没有回调,因而无从得知组件是否被销毁.所以我们需要使用ISystemStateComponentData. 什么时ISystemStateComponentData状态组件? 当物体被销毁时ISystemStateComponentData组件不会被销毁.因而我们可以在组件被销毁时在该组件中…

搭建大型分布式服务(三十八)SpringBoot 整合多个kafka数据源-支持protobuf

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目&#xff0c;每天处理上亿级的数据的精简小插件&#xff0c;快速上手。 <dependency><groupId>io.github.vipjo…

Clo3D导出服装动画,使用Unity3D展示

1.前言 Clo3D是一款应用于时装行业的3D服装设计软件,其强大的布料模拟算法可在3D空间中实现设计、制版、试衣和走秀,大幅提升数字作品逼真度和制作效率。为了让服装动画效果展示在Unity3D上模拟效果&#xff0c;需要Clo3D模拟出逼着的衣服动画。总体流程为Clo3D - Mixamo -Blen…

废酸再生工艺的稳定性强优势

废酸再生工艺&#xff0c;作为现代工业中一项重要的环保技术&#xff0c;其核心目的是将工业生产过程中产生的废酸进行回收、处理和再利用&#xff0c;以实现资源的节约和环境的保护。这一工艺不仅有助于减少废酸对环境的污染&#xff0c;还能为企业带来显著的经济效益。 一、废…

idea实用快捷键(持续更新...)

文章目录 1、快速输入try/catch/finally2、选中多个光标3、实现接口4、方法参数提示5、查看某个类的子类6、弹出显示查找内容的搜索框 1、快速输入try/catch/finally CtrlAltT 2、选中多个光标 ShiftAlt单机多选 End可以全部到行尾&#xff0c;Home则可以全部回到行首 3、实现接…

MySQL的增删改查2

文章目录 1. 数据库约束1.1 约束类型1.2 NOT NULL约束1.3 UNIQUE唯一约束1.4 DEFAULT默认值约束1.5 PRIMARY KEY主键约束1.6 FOREIGN KEY外键约束1.7 CHECK约束 2. 新增3. 查询3.1 聚合查询3.1.1 聚合函数3.1.2 GROUP BY子句3.1.3 HAVING 3.2 联合查询3.2.1 内连接3.2.2 外连接…

慧天卓特:2024年“一带一路”之哈萨克斯坦旱情监测案例分析(FYDI)

引言 联合国防治荒漠化公约组织指出&#xff1a;中亚约有1200万人生活在干旱风险高的地区&#xff0c;面积约为4000万公顷。位于亚洲中部的哈萨克斯坦共和国&#xff08;简称哈萨克斯坦&#xff09;和中国有着长期友好的睦邻和经贸关系&#xff0c;中国是哈萨克斯坦的主要农产…

C++:day3

思维导图 练习题 #include <iostream> using namespace std;class Per { private:string name;int age;int *height;double weight;public:Per(){cout << "Per::无参构造函数" << endl;}Per(string name, int age, int height, double weight) :…

2004NOIP普及组真题 2. 花生采摘

线上OJ&#xff1a; 【04NOIP普及组】花生采摘 核心思想&#xff1a; 1、本题为贪心即可。 2、因为本题严格限制了顺序&#xff0c;所以先把每个节点的花生数量按降序排序。然后逐一判断下一个花生是否需要去采摘即可 3、每一次采摘完&#xff0c;记录耗时 t 以及采集的花…

GPT-4o(OpenAI最新推出的大模型)

简介&#xff1a;最近&#xff0c;GPT-4o横空出世。对GPT-4o这一人工智能技术进行评价&#xff0c;包括版本间的对比分析、GPT-4o的技术能力以及个人感受等。 方向一&#xff1a;对比分析 GPT-4o&#xff08;OpenAI最新推出的大模型&#xff09;与GPT-4之间的主要区别体现在响应…