C++【二叉树进阶试题】

news2024/11/29 6:37:20

✨个人主页: 北 海
🎉所属专栏: C/C++相关题解
🎃操作环境: Visual Studio 2019 版本 16.11.17

成就一亿技术人


文章目录

  • 606. 根据二叉树创建字符串
  • 102. 二叉树的层序遍历
  • 107. 二叉树的层序遍历 II
  • 236. 二叉树的最近公共祖先
  • JZ36 二叉搜索树与双向链表
  • 105. 从前序与中序遍历序列构造二叉树
  • 106. 从中序与后序遍历序列构造二叉树
  • 144. 二叉树的前序遍历
  • 94. 二叉树的中序遍历
  • 145. 二叉树的后序遍历


这是一篇关于 二叉树 题解博客,主要包含以下题目,可根据当前文章中的目录随意跳转查看

题目

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

题目链接:606. 根据二叉树创建字符串

题目

题目分析:对二叉树进行前序遍历,并将遍历的结果转化为字符串,同时需要对 左右子树 加上 () 修饰,必要的 () 不能省略,比如:左子树不存在,但右子树存在,那么左子树的 () 就不能省略

解题思路:首选递归解决,大问题化小问题,首先将 根节点转化为字符串,然后判断 [左子树 || 右子树] 是否存在,如果存在,则递归左子树,再判断 [右子树] 是否存在,如果存在,则递归右子树

图解
理清思路后,就可以开始编写代码了

//606. 根据二叉树创建字符串
//https://leetcode.cn/problems/construct-string-from-binary-tree/

class Solution {
public:
    void _tree2str(TreeNode* root, string& str)
    {
        if(root == nullptr)
            return;
        
        str += to_string(root->val);    //先将根的值并入字符串中

        //判断是否需要递归子树
        if(root->left != nullptr || root->right != nullptr)
        {
            //左右其中一个不为空,都需要递归左子树
            str += "(";
            _tree2str(root->left, str);
            str += ")";
        }

        if(root->right != nullptr)
        {
            //右不为空,才递归右子树
            str += "(";
            _tree2str(root->right, str);
            str += ")";
        }
    }

    string tree2str(TreeNode* root) {
        string str; //创建后的字符串
        _tree2str(root, str);   //建议再封装一层,方便递归
        return str;
    }
};

结果

注意: 因为是递归,所以参数2 str 需要使用引用,确保在不同栈帧中对同一个字符串进行操作


102. 二叉树的层序遍历

题目链接:102. 二叉树的层序遍历

题目

题目分析:层序遍历的升级版,层序遍历后,要求将每一层的结果作为一个一维数组,存入二维数组中

解题思路:在层序遍历思想的基础上,将每一层的节点数统计起来,出结果时,以节点数为主

层序遍历思想:借助队列,首先根节点入队,然后出队,并将存在的左右子节点带入队中,重复此过程,直到队列为空

图解
所以本题的解题关键就在于 入队时要额外使用一个计数器统计当前队列中的节点数,方面后面出队

//102. 二叉树的层序遍历
//https://leetcode.cn/problems/binary-tree-level-order-traversal/

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> vv; //二维数组

        if(root == nullptr)
            return vv;

        queue<TreeNode*> q; //存储节点的队列
        q.push(root);
        int cnt = q.size(); //当前队列中的节点数

        //层序遍历思想
        while(!q.empty())
        {
            vector<int> v;  //这一次的遍历结果

            //根据节点数进行出队
            while(cnt--)
            {
                TreeNode* cur = q.front();
                q.pop();
                v.push_back(cur->val);

                if(cur->left != nullptr)
                    q.push(cur->left);
                
                if(cur->right != nullptr)
                    q.push(cur->right);
            }

            //这一层的结果入二维数组
            vv.push_back(v);

            //重新更新节点数
            cnt = q.size();
        }

        return vv;
    }
};

题解

注意: 在单层遍历结束后,需要更新计数器的值


107. 二叉树的层序遍历 II

题目链接:107. 二叉树的层序遍历 II

图示

题目分析:在上一题的基础上,把结果进行逆置即可

//107. 二叉树的层序遍历 II
//https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/

class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        vector<vector<int>> vv; //二维数组

        if(root == nullptr)
            return vv;

        queue<TreeNode*> q; //存储节点的队列
        q.push(root);
        int cnt = q.size(); //当前队列中的节点数

        //层序遍历思想
        while(!q.empty())
        {
            vector<int> v;  //这一次的遍历结果

            //根据节点数进行出队
            while(cnt--)
            {
                TreeNode* cur = q.front();
                q.pop();
                v.push_back(cur->val);

                if(cur->left != nullptr)
                    q.push(cur->left);
                
                if(cur->right != nullptr)
                    q.push(cur->right);
            }

            //这一层的结果入二维数组
            vv.push_back(v);

            //重新更新节点数
            cnt = q.size();
        }

        //重要的一步:逆置
        reverse(vv.begin(), vv.end());

        return vv;
    }
};

结果


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

题目链接:236. 二叉树的最近公共祖先

题目
题目分析:二叉树中的经典题目,某个节点到根节点的路径是唯一的,路径中的节点都是其祖先,如果某两个节点的路径出出现了交叉,那么这个交叉点就是他们公共的祖先。值得注意的是,节点也是自己的祖先,所以节点 p 可以成为 节点 p 与 节点 q 的公共祖先,同理,节点 q 也行

这里提供两种解题思路,前者比较容易想到,后者则比较巧妙

解题思路1:某个节点的左右子树中如果分别包含 pq 节点,那么这个节点就是它们的祖先节点,将问题转化为判断节点是否存在于子树中

图示

//236. 二叉树的最近公共祖先
//https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/

class Solution {
public:
    bool findVal(TreeNode* root, TreeNode* node)
    {
        if(root == nullptr)
            return false;

        return root == node || 
               findVal(root->left, node) || 
               findVal(root->right, node);
    }

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root == nullptr)
            return nullptr;

        //如果当前节点为其中一个目标节点,则为最近公共祖先
        if(root == p || root == q)
            return root;

        //分别到左右子树中找 p、q
        bool leftP = findVal(root->left, p);
        bool rightP = findVal(root->right, p);

        bool leftQ = findVal(root->left, q);
        bool rightQ = findVal(root->right, q);

        //只要其中一组合法,当前节点就是公共祖先,否则递归向下找
        if((leftP && rightQ) || (leftQ && rightP))
            return root;
        //都在左子树,去左子树找
        else if(leftP && leftQ)
            return lowestCommonAncestor(root->left, p, q);
        //都在右子树,去右子树找
        else
            return lowestCommonAncestor(root->right, p, q);
    }
};

结果

这种解法的优点就是 容易想到,书写简单,缺点就很明显了 慢,非常慢,最坏的情况下每一个节点都需要进行一遍查找

所以就有了解法2

解题思路2:既然每个节点到根的路径是唯一的,那么可以把路径记录下来,然后将问题转换为链表相交问题

如何获取路径:后序遍历思想,将节点保存入栈中,不包含在目标值路径中的需要弹出

图示

//236. 二叉树的最近公共祖先
//https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/

//解法2:获取路径
class Solution {
public:
    bool getPath(TreeNode* root, const TreeNode* node, stack<TreeNode*>& path)
    {
        if(root == nullptr)
            return false;
        
        //先将节点入栈
        path.push(root);

        if(root == node)
            return true;

        //判断左右子路径中包含 node 节点
        bool inLeft = getPath(root->left, node, path);
        bool inRight = getPath(root->right, node, path);

        if(inLeft == false && inRight == false)
        {
            //此节点的子树中必然不包含 node 节点
            //无用,需要弹出
            path.pop();
            return false;
        }

        return true;

    }

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        stack<TreeNode*> pPath; //路径
        stack<TreeNode*> qPath;

        //获取路径
        getPath(root, p, pPath);
        getPath(root, q, qPath);

        //长的路径先走
        while(pPath.size() != qPath.size())
        {
            if(pPath.size() > qPath.size())
                pPath.pop();
            else
                qPath.pop();
        }

        //一起弹出,寻找最近公共祖先
        while(pPath.size())
        {
            if(pPath.top() == qPath.top())
                break;
            pPath.pop();
            qPath.pop();
        }

        return pPath.top();
    }
};

结果

这种解法的优势就很明显了 速度极快

注意:

  • getPath 函数的返回值仅仅是用来评判当前节点是否会被弹出
  • 参数3 stack<TreeNode*> 需要使用引用,确保在不同栈帧中修改的是同一个路径

JZ36 二叉搜索树与双向链表

题目链接:JZ36 二叉搜索树与双向链表

题目
题目分析:将二叉树变成双向链表,因为二叉每个节点都有左、右指针,就像双向链表中的前、后指针一样,所以可以将其进行转换;其实这里是一棵二叉搜索树,而题目要求转换后的双向链表有序,可以借助二叉搜索树的特性:中序遍历有序来进行转换

解题思路:在二叉树中序遍历的基础之上,传递指向当前节点的指针和指向上一个节点的指针,在两者之间建立链接关系,当中序遍历结束后,双向链表就转换完成了

图示

为什么是 prevright 链接 cur

  • 因为当前是中序遍历(左根右),prev 是上一个节点,left 已链接了上上一个节点,不能更改
//JZ36 二叉搜索树与双向链表
//https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&&tqId=11179&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

class Solution {
  public:
    void treeTransToList(TreeNode* cur, TreeNode*& prev) {
        if (cur == nullptr)
            return;

        treeTransToList(cur->left, prev);

        if (prev != nullptr) {
            //细节: prev 的 right 链接 cur
            //      cur  的 left 链接 prev
            prev->right = cur;
            cur->left = prev;
        }
        prev = cur;

        treeTransToList(cur->right, prev);
    }

    TreeNode* Convert(TreeNode* pRootOfTree) {
        //记录上一次遍历的节点,与之建立链接关系
        TreeNode* prev = nullptr;

        treeTransToList(pRootOfTree, prev);

        //找到最左节点,即头节点
        TreeNode* head = pRootOfTree;
        while (head != nullptr && head->left != nullptr)
            head = head->left;

        return head;
    }
};

结果

注意:

  • 传递参数时,上一个节点需要使用引用接收,链接不同栈帧中的节点
  • 寻找最左节点时,需要先对当前节点做判空处理,避免野指针

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

题目链接:105. 从前序与中序遍历序列构造二叉树

图示
题目分析:给定一个前序和中序遍历,还原出二叉树,前序【根左右】、中序【左根右】,因此前序序列中的第一个节点一定是整个二叉树的根

解题思路:传递前序和中序序列,根据前序序列中的节点,创建根节点,再去中序序列中找到找到左右子树区间,创建左右子树,进行链接

图示

//105. 从前序与中序遍历序列构造二叉树
//https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

class Solution {
public:
    TreeNode* _buildTree(vector<int>& preorder, int& pos, vector<int>& inorder, int begin, int end)
    {
        //如果区间非法,就返回空
        if(begin >= end)
            return nullptr;

        //创建当前节点
        TreeNode* root = new TreeNode(preorder[pos]);
        int rooti = begin;

        //从中序序列中划分出区间  [begin, rooti) [rooti + 1, end)
        while(rooti < end)
        {
            if(preorder[pos] == inorder[rooti])
                break;
            rooti++;
        }
        pos++;  //重要,每构建一个节点,前序序列节点 -1

        //链接左右子树
        root->left = _buildTree(preorder, pos, inorder, begin, rooti);
        root->right = _buildTree(preorder, pos, inorder, rooti + 1, end);

        return root;
    }

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        //前序确认根
        //中序确认子树
        int pos = 0;
        TreeNode* root = _buildTree(preorder, pos, inorder, 0, inorder.size());
        return root;
    }
};

结果
注意: 前序序列的下标 pos 需要使用引用,因为每个栈帧中的节点创建都会使 pos 发生改变,即不同栈帧中的 pos 是同一个


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

题目链接:106. 从中序与后序遍历序列构造二叉树

题目
题目分析:前序、中序可以重构二叉树,中序、后序同样也可以,因为后序一样可以确认根,然后一样从中序序列中划分区间

解题思路:反向遍历后序序列,创建根节点,从中序序列中划分出左右区间,递归获取结果后进行链接

//106. 从中序与后序遍历序列构造二叉树
//https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/

class Solution {
public:
    TreeNode* _buildTree(vector<int>& inorder, int begin, int end, vector<int>& postorder, int& pos)
    {
        if(begin >= end)
            return nullptr;
        
        TreeNode* root = new TreeNode(postorder[pos]);
        int rooti = begin;

        //根据根节点的值,划分子区间 [begin, rooti) [rooti + 1, end)
        while(rooti < end)
        {
            if(inorder[rooti] == postorder[pos])
                break;
            rooti++;
        }
        pos--;  //注意:后序 pos 是--

        //注意:后序需要先链接右子树,再链接左子树
        root->right = _buildTree(inorder, rooti + 1, end, postorder, pos);
        root->left = _buildTree(inorder, begin, rooti, postorder, pos);

        return root;
    }

    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        //后序确定根
        //中序确定子树
        int pos = postorder.size() - 1;
        TreeNode* root = _buildTree(inorder, 0, inorder.size(), postorder, pos);
        return root;
    }
};

图示
注意: 中序、后序重构二叉树时,需要先链接右子树,再链接左子树


144. 二叉树的前序遍历

题目链接:144. 二叉树的前序遍历

图示
题目分析:前序遍历【根左右】,二叉树的必备技能,递归写法很简单,几行代码就解决了,因此这里挑战的是迭代写法

解题思路:利用栈模拟递归过程,先访问根节点,然后向左走,直到走到空,访问完左路节点后,判断右子树是否为空,不为空则往右走

图示

//144. 二叉树的前序遍历
//https://leetcode.cn/problems/binary-tree-preorder-traversal/

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        //前序:根左右
        //借助栈模拟递归过程

        stack<TreeNode*> node;
        vector<int> v;

        TreeNode* cur = root;
        while(cur || !node.empty())
        {
            //先访问根节点及左路节点
            while(cur)
            {
                node.push(cur);
                v.push_back(cur->val);
                cur = cur->left;    //访问左路节点
            }

            TreeNode* top = node.top();
            node.pop();

            if(top->right != nullptr)
                cur = top->right;
        }

        return v;
    }
};

结果
注意: 如果右路为空,是不需要更新 cur 的,即不需要访问右路节点


94. 二叉树的中序遍历

题目链接:94. 二叉树的中序遍历

题目
题目分析:中序【左根右】,迭代实现

解题思路:跟前序遍历一样,利用栈模拟递归过程,先向左走,将结果入栈,直到走到空,然后访问栈顶元素(根),再判断是否需要访问右路节点

//94. 二叉树的中序遍历
//https://leetcode.cn/problems/binary-tree-inorder-traversal/

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        //中序:左根右

        stack<TreeNode*> node;
        vector<int> v;

        TreeNode* cur = root;
        while(cur || !node.empty())
        {
            //先将左路节点入栈
            while(cur)
            {
                node.push(cur);
                cur = cur->left;
            }

            //访问根节点
            TreeNode* top = node.top();
            node.pop();
            v.push_back(top->val);

            //判断是否需要访问右路节点
            if(top->right != nullptr)
                cur = top->right;
        }

        return v;
    }
};

图示
思路和前序遍历没啥区别,稍微改动下就好了


145. 二叉树的后序遍历

题目链接:145. 二叉树的后序遍历

题目

题目分析:后序遍历【左右根】,通过迭代实现,不过后序会更难一些

解题思路:一样用栈模拟递归过程,先访问左路节点,然后判断是否能访问根节点:右路为空 或者 右节点已经访问过,才能访问根节点,否则只能先访问右路节点

//145. 二叉树的后序遍历
//https://leetcode.cn/problems/binary-tree-postorder-traversal/

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        //后序:左右根

        stack<TreeNode*> node;
        vector<int> v;
        TreeNode* prev = nullptr;
        TreeNode* cur = root;

        while(cur || !node.empty())
        {
            //先访问左路节点
            while(cur)
            {
                node.push(cur);
                cur = cur->left;
            }

            TreeNode* top = node.top();
            //判断是否需要访问根
            //条件:右为空 或者 右节点已经访问过了
            if(top->right == nullptr || (top->right == prev))
            {
                v.push_back(top->val);
                node.pop();
                prev = top;
            }
            //访问右路节点
            else
                cur = top->right;
        }

        return v;
    }
};

结果
注意: 只有右路节点访问过了,才能去访问根节点,即 左右根


星辰大海

相关文章推荐

Day6 不要二、把字符串转换成整数

Day5 统计回文、连续最大和

Day4 计算糖果、进制转换

Day3 字符串中找出连续最长的数字串、数组中出现次数超过一半的数字

Day2 排序子序列、倒置字符串

Day1 组队竞赛、删除公共字符

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

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

相关文章

位姿估计 | 从目标特征点检测到目标体坐标系相对于相机坐标系的位姿估计过程

目录 引言技术流程1. PNP介绍2. ICP介绍a. 利用ICP求解目标相对相机的位姿b. 利用ICP求解相机帧间运动 引言 本文接着分享空间目标位姿跟踪和滤波算法中用到的一些常用内容&#xff0c;希望为后来者减少一些基础性内容的工作时间。以往分享总结见文章&#xff1a;位姿跟踪 | 相…

当你全力以赴世界也会为你让路,23级人大女王金融硕士准备中

当你全力以赴&#xff0c;世界也会为你让路&#xff0c;在申报人民大学与加拿大女王大学金融硕士&#xff08;国际班&#xff09;项目的路上你真的努力了吗&#xff1f; 记得曾经在知乎上看过一个问题“什么事情给你的生活带来什么改变”&#xff0c;下边有很多人回答说&#x…

【每日算法】【202. 快乐数】

☀️博客主页&#xff1a;CSDN博客主页 &#x1f4a8;本文由 我是小狼君 原创&#xff0c;首发于 CSDN&#x1f4a2; &#x1f525;学习专栏推荐&#xff1a;面试汇总 ❗️游戏框架专栏推荐&#xff1a;游戏实用框架专栏 ⛅️点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd;&…

【Linux】—— 详解计算机体系结构

前言&#xff1a; 在之前&#xff0c;我们已经对Linux环境开发的基本工具进行了详细的学习。接下来&#xff0c;我们将要学习的第一大块便是关于计算机体系结构的知识&#xff01;&#xff01; 目录 前言 &#xff08;一&#xff09;冯诺依曼体系结构 基本介绍 木桶原理 …

SpringSecurity实现前后端分离登录授权详解

在介绍完SpringSecurity实现前后端分离认证之后&#xff0c;然后就是SpringSecurity授权&#xff0c;在阅读本文章之前可以先了解一下作者的上一篇文章SpringSecurity认证SpringSecurity实现前后端分离登录token认证详解_山河亦问安的博客-CSDN博客。 目录 1. 授权 1.1 权限系…

线程间的通信机制与生产者消费者案例

线程间的通信机制与生产者消费者案例 线程间通信 为什么要处理线程间通信&#xff1a; 当我们需要多个线程来共同完成一件任务&#xff0c;并且我们希望他们有规律的执行&#xff0c;那么多线程之间需要一些通信机制&#xff0c;可以协调他们的工作&#xff0c;以此实现多线…

中空百叶玻璃隔断怎么组装

以下是中空百叶玻璃隔断的组装步骤&#xff1a; 1. 准备材料&#xff1a;中空百叶玻璃、接头、U型槽、挂件、固定螺钉等。 2. 根据实际需要&#xff0c;将中空百叶玻璃按照尺寸进行切割。 3. 在地面上铺上一张软垫&#xff0c;将切好的玻璃放置在垫子上&#xff0c;然后在两侧标…

自动化部署工具 drone 部署文档 (使用于 vue java 部署 其他自行研究)

1.准备好docker环境 drone 官网 Drone CI – Automate Software Testing and Delivery 推荐使用宝塔傻瓜式一键安装宝塔面板 - 简单好用的Linux/Windows服务器运维管理面板 安装好docker环境之后开始部署容器 这里用到的git版本软件是gogs,其他自己研究 docker版的gogs和实…

Linux内存管理 —— 文件系统缓存和匿名页的交换

转自&#xff1a;https://www.cnblogs.com/wangshaowei/p/14089132.html 文件页 内存回收&#xff0c;也就是系统释放掉可以回收的内存&#xff0c;比如缓存和缓冲区&#xff0c;就属于可回收内存。它们在内存管理中&#xff0c;通常被叫做文件页&#xff08;File-backed Pag…

B045-jQuery案例实战BootStrap

目录 一、BootStrap概述二、BootStrap使用1.起步1.下载或放入BootStrap文件到本地工程里2.在html代码中引入1个css文件和两个js文件3.复制模板代码到本地html文件里会自动应用成bootStrap图样中的效果0.实战案例-环境准备0.实战案例-基本模板 2.布局容器3.栅格系统4.常用组件表…

echarts里type为custom,自定义配置renderItem为柱状形状

echarts里type为custom&#xff0c;自定义配置renderItem为柱状形状 echarts里type为custom&#xff0c;自定义配置renderItem为柱状形状 echarts里type为custom&#xff0c;自定义配置renderItem为柱状形状 主要功能&#xff1a;文本超过柱状形状就隐藏否则就显示&#xff0c;…

风口上的AIGC,技术人才动不动就年薪百万?

2023年&#xff0c;职场人都在讨论什么&#xff1f; 自今年3月以来&#xff0c;随着ChatGPT应用持续走俏&#xff0c;AIGC领域抢人大战盛况空前。随之而来的便是“AI取代人类”“10亿打工人被革命”&#xff0c;AI的发展速度和步伐&#xff0c;超乎我们预期&#xff0c;也影响…

MySQL - 第0节 - MySQL在Centos 7环境安装

1.安装前说明 • 安装与卸载过程中&#xff0c;用户全部切换成为root&#xff0c;一旦安装&#xff0c;普通用户也能够使用。 • 初期练习&#xff0c;mysql不进行用户管理&#xff0c;全部使用root进行&#xff0c;后面学了用户管理&#xff0c;再考虑新建普通用户。 注&#…

互联网医院资质申请条件|互联网医院申请流程

互联网医院是医疗行业应用互联网技术的一种创新形态&#xff0c;它为患者提供便捷的医疗服务&#xff0c;改善了医疗资源的不足和分散情况。在中国&#xff0c;互联网医院的发展也越来越受到重视&#xff0c;互联网医院牌照的申请流程和需要的资料也成为了关注的焦点。 一、互…

SpringCloud 中各微服务使用 springcloud-config 获取配置文件时,配置信息无法实时刷新

文章目录 1、引入actuator监控2、修改 yml3、添加注解 RefreshScope4、业务操作5、发送通知&#xff0c;即可生效6、思考 使用 springcloud-config 作为 服务配置 管理时&#xff0c; 当对 git 上的配置进行修改后&#xff0c; 各微服务客户端 配置无法 实时刷新&#xff0c;需…

【Flutter】Flutter 切换语言 当前页面不刷新

文章目录 一、前言二、Flutter 多语言支持的基础知识三、如何在 Flutter 中设置语言四、如何在 Flutter 中切换语言五、代码示例六、完整代码七、总结 一、前言 大家好&#xff0c;今天我们要探讨的主题是如何在 Flutter 中切换语言&#xff0c;而不需要刷新当前页面。这是一个…

vue-element-admin - 最新完美解决项目是英文的问题,将英文变成中文的汉化处理详细教程(克隆完项目后不是中文的解决方法)

前言 网上的教程(并且都是好几年前的了)克隆运行后界面文字全都是英文的,如果您想要中文汉语版本请使用本文的方案。 本文 解决了克隆运行 vue-element-admin 项目后,默认是英文的问题!将语言设置为中文的详细教程! 官方文档说的很晦涩,您可以按照本教程步骤进行操作即…

log4j配置说明

目录&#xff1a; 1、 引入jar包使用 2、 使用 3、 配置文件 4、 配置 5、 说明 说明&#xff1a;2015年9月&#xff0c;Apache软件基金业宣布&#xff0c;Log4j不在维护&#xff0c;建议所有相关项目升级到Log4j2。 1.引入jar包使用 <dependency><groupI…

vscode 调试

目录 准备 GDB 调试方法 问题 准备 然后点击 文件-打开文件夹&#xff0c;找到创建的代码路径&#xff0c;确定后&#xff0c;在左侧的资源管理器可以看到代码文件。 第一次运行需要安装 c 的扩展&#xff0c;在扩展页面中&#xff0c;安装 C/C 编译注意一定要加上 -g 指令…

SpringBoot项目配置方式及优先级

说明&#xff1a;SpringBoot支持以下五种方式配置方式&#xff0c;例如将项目的Tomcat端口从8080&#xff0c;更改为9000&#xff0c;可以使用如下方式配置 【方式一】命令行参数 在启动窗口&#xff0c;鼠标右键&#xff0c;选择“Edit Configurations”&#xff0c;在弹出来…