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

【C++】10道经典面试题带你玩转二叉树

🦄个人主页:修修修也

🎏所属专栏:C++

⚙️操作环境:Leetcode/牛客网


目录

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

二.二叉树的层序遍历

三.二叉树的层序遍历 II

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

五.二叉搜索树与双向链表

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

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

八.二叉树的前序遍历(迭代算法)

九.二叉树的中序遍历(迭代算法)

十.二叉树的后序遍历(迭代算法)

结语


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

题目链接:

606. 根据二叉树创建字符串icon-default.png?t=O83Ahttps://leetcode.cn/problems/construct-string-from-binary-tree/


题目描述:

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

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


题目详情:


解题思路:

使用前序遍历遍历整颗树即可,但是要注意遍历根节点时不需要加括号,如果有子树,无论左子树有没有都要加括号,右子树有才加,没有就不加。具体细节见解题代码注释。

解题代码:

class Solution 
{
public:string tree2str(TreeNode* root) {if(root){//先遍历根节点string ret = to_string(root->val);//不用to_string用+48会遇到负数//只要左或右不为空,就进去执行,否则是叶子,直接返回if(root->left || root->right){//再遍历左子树//因为左树为空也必须有"()",所以我们不用判断直接执行ret += ( '(' + tree2str(root->left) + ')' );//最后遍历右子树//因为右树为空没有"()",所以我们需要判断一下if(root->right){ret += ( '(' + tree2str(root->right) + ')' );}}return ret;}else{return "";}}
};

提交运行:


二.二叉树的层序遍历

题目链接:

102. 二叉树的层序遍历icon-default.png?t=O83Ahttps://leetcode.cn/problems/binary-tree-level-order-traversal/


题目描述:

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


题目详情:


解题思路:

        思路就是因为我们要返回的是二维数组,所以必须要记录下结点是哪一层的.有两种方法可以使用:

  1. 一种是用两个队列,第一个队列先入第一层的结点,然后出第一个队列结点时将下一层结点存入第二个队列中,出第二个队列时再把下一层结点存入第一个队列中,边出边将数据存入相应层的vector里,直到两个队列中的结点出完代表二叉树层序遍历结束.
  2. 另一种是使用一个队列,然后使用一个levelSize变量来记录下上一层结点出的时候入了多少个,下一层就循环多少次将数据放入vector里,直到队列出空,代表二叉树遍历结束.

解题代码:

class Solution 
{
public:vector<vector<int>> levelOrder(TreeNode* root) {//因为要返回的是二维数组,所以必须双队列或者用一个变量控制levelSize//我们就是一层一层入,一层一层出,一层入完统计有多少个,出下层就出多少个queue<TreeNode*> q;vector<vector<int>> vv;int levelSize=0;if(root){q.push(root);levelSize=1;}while(!q.empty())//while循环一次就是一层{vector<int> v;for(int i=0;i<levelSize;i++){TreeNode*front=q.front();q.pop();v.push_back(front->val);if(front->left!=nullptr){q.push(front->left);}if(front->right!=nullptr){q.push(front->right);}}vv.push_back(v);levelSize=q.size();}return vv;}
};

提交运行:


三.二叉树的层序遍历 II

题目链接:

107. 二叉树的层序遍历 IIicon-default.png?t=O83Ahttps://leetcode.cn/problems/binary-tree-level-order-traversal-ii/


题目描述:

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


题目详情:


解题思路:

需要倒着层序遍历二叉树,我们可以先正着遍历,然后再把存放数据的二维数组逐层逆置一下就可以了,正着层序遍历的思路和代码和上题一模一样这里就不赘述了.

解题代码:

class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root) {//先正着层序遍历,后面再逆置一下就行//因为要返回的是二维数组,所以必须双队列或者用一个变量控制levelSize//我们就是一层一层入,一层一层出,一层入完统计有多少个,出下层就出多少个queue<TreeNode*> q;vector<vector<int>> vv;int levelSize=0;if(root){q.push(root);levelSize=1;}while(!q.empty())//while循环一次就是一层{vector<int> v;for(int i=0;i<levelSize;i++){TreeNode*front=q.front();q.pop();v.push_back(front->val);if(front->left!=nullptr){q.push(front->left);}if(front->right!=nullptr){q.push(front->right);}}vv.push_back(v);levelSize=q.size();}//要倒着的层序遍历,那我们先正着存,再逆置一下数组就行vv.vector<vector<int>> vvr;for(int i=vv.size()-1;i>=0;i--){vvr.push_back(vv[i]);}return vvr;}
};

提交运行:


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

题目链接:

236. 二叉树的最近公共祖先icon-default.png?t=O83Ahttps://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/


题目描述:

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

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


题目详情:


解题思路:

方法一:暴力查找

借用搜索二叉树的查找思路,重点是向下查找时,找到它们最开始"分叉"的那个结点,就是最近祖先结点,图示如下:           因此我们只需要递归找到从这个结点开始两个结点一个位于它左子树一个位于它右子树的那个结点,就是最近共同祖先,这种思路简单,但是时间复杂度较高,在O(nlogn)~O(n^2)之间.

方法二:栈存路径

        方法二的思路是我在查找p,q结点的时候顺带用两个栈把它们的路径存下来,然后找到栈的最顶上的相等结点即可,该思路时间复杂度较低,为O(n),思路图示如下:


解题代码:

方法一:

class Solution 
{
public:bool Find(TreeNode* root, TreeNode* x){if(root==nullptr){return false;}return root==x || Find(root->left,x)||Find(root->right,x);}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root == nullptr)   //这种是找不到的情况,可以不写,因为题干说两个结点一定存在{return nullptr;}if(root == p || root == q)  //如果p/q就是root了,那其公共祖先一定是它本身{return root;}//开始确定p,q对于root的位置bool pInLeft,pInRight,qInLeft,qInRight;pInLeft=Find(root->left,p);   //pInLeft记录p在root的左子树存在情况pInRight=!pInLeft;    //pInright记录p在root的右子树存在情况qInLeft=Find(root->left,q);    //qInLeft记录q在root的左子树存在情况qInRight=!qInLeft;      //qInright记录q在root的右子树存在情况if(pInLeft && qInLeft)  //如果p,q都在root的左子树,那向左继续找{return lowestCommonAncestor(root->left,p,q);}else if(pInRight && qInRight)  //如果p,q都在root的右子树,那向右继续找{return lowestCommonAncestor(root->right,p,q);}else        //如果p,q一个在root的左子树,一个在root的右子树,那root就是分叉点,就是最近共同祖先{return root;}}
};

提交运行:

方法二:

class Solution 
{
public:bool FindPath(TreeNode* root,TreeNode* x, stack<TreeNode*>& path){if(root == nullptr){return false;}path.push(root);if(root==x)return true;if(FindPath(root->left,x,path))return true;if(FindPath(root->right,x,path))return true;path.pop();return false;}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {stack<TreeNode*> pPath,qPath;FindPath(root,p,pPath);FindPath(root,q,qPath);while(pPath.size()>qPath.size()){pPath.pop();}while(pPath.size()<qPath.size()){qPath.pop();}while(pPath.top()!=qPath.top()){pPath.pop();qPath.pop();}return pPath.top();}
};

提交运行:


五.二叉搜索树与双向链表

题目链接:

JZ36 二叉搜索树与双向链表icon-default.png?t=O83Ahttps://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&&tqId=11179&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking


题目描述:

        输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示

        数据范围:输入二叉树的节点数 0≤n≤10000≤n≤1000,二叉树中每个节点的值                         0≤val≤10000≤val≤1000
        要求:空间复杂度O(1)O(1)(即在原树上操作),时间复杂度 O(n)O(n)

注意:

  1. 要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继
  2. 返回链表中的第一个节点的指针
  3. 函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构
  4. 你不用输出双向链表,程序会根据你的返回值自动打印输出

题目详情:


解题思路:

使用中序递归遍历的逻辑函数,函数包含两个参数,一个表示当前结点,一个表示上一层递归的结点prev。因为搜索二叉树中序遍历的结点顺序就是有序的,因此只要在遍历时顺便将这些结点前后链接起来即可.具体链接时,因为我们传给函数的参数是当前结点和上一结点,所以我们链接时,就将当前结点的左指针连接上上一结点,然后将上一结点的右指针连接上当前结点即可,更多细节见解题代码注释.

解题代码:

class Solution 
{
public://中序遍历void InOrder(TreeNode* cur,TreeNode*& prev)//传引用就不怕改形参不影响实参了{if (cur == nullptr)return;//中序:左InOrder(cur->left,prev);//链接左指针使其连接到上一个递归的结点cur->left=prev;//链接前一个的右指针使其指向我自己if(prev)prev->right=cur;prev=cur;//中序:右InOrder(cur->right,prev);}TreeNode* Convert(TreeNode* pRootOfTree) {TreeNode* prev = nullptr;InOrder(pRootOfTree,prev);//找最左结点,一直往左走就行,但小心一开始就为空的情况TreeNode* cur=pRootOfTree;while(cur && cur->left){cur=cur->left;}return cur;}
};

提交运行:


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

题目链接:

105. 从前序与中序遍历序列构造二叉树icon-default.png?t=O83Ahttps://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/


题目描述:

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


题目详情:


解题思路:

        将前序结点数组按照从前向后的顺序遍历, 将每一个结点都看作根,然后去中序根据这个根来划分左右子树。中序数组中,左子树一定在根的左边,右子树一定在根的右边, 到下一个结点时,就更新下一个结点的子树范围。

        如果这个范围不存在,那表明这个树没有子树,直接链接nullptr即可。

        图示如下:


解题代码:

class Solution 
{
public:TreeNode* _buildTree(vector<int>& preorder, vector<int>& inorder, int& prei, int inbegin, int inend) {if(inbegin > inend)return nullptr;TreeNode* root = new TreeNode(preorder[prei]);int rooti = inbegin;while(rooti <= inend){if(preorder[prei] == inorder[rooti])break;++rooti;}//根据中序将数组分为三段//      左子树          根          右子树//[inbegin,rooti-1]  [rooti]  [rooti+1,inend]++prei;root->left=_buildTree(preorder,inorder,prei,inbegin,rooti-1);root->right=_buildTree(preorder,inorder,prei,rooti+1,inend);return root;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int prei=0;return _buildTree(preorder,inorder,prei,0,inorder.size()-1);}
};

提交运行:


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

题目链接:

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


题目描述:

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


题目详情:


解题思路:

本题与上一题思路相似,只是后序数组要从后向前遍历构造二叉树,则后序数组向前访问到的结点的顺序是先根再右再左,只有这一点需要特别注意,其余和上一题没有什么区别.图示如下:

解题代码:

class Solution 
{
public:TreeNode* _buildTree(vector<int>& inorder, vector<int>& postorder, int& prei, int inbegin, int inend) {if(inbegin > inend)return nullptr;TreeNode* root = new TreeNode(postorder[prei]);int rooti = inbegin;while(rooti <= inend){if(postorder[prei] == inorder[rooti])break;++rooti;}//根据中序将数组分为三段//      左子树          根          右子树//[inbegin,rooti-1]  [rooti]  [rooti+1,inend]--prei;//后序从后向前遍历时是先根再右再左!root->right=_buildTree(inorder,postorder,prei,rooti+1,inend);root->left=_buildTree(inorder,postorder,prei,inbegin,rooti-1);return root;}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {int prei=inorder.size()-1;return _buildTree(inorder,postorder,prei,0,inorder.size()-1);}
};

提交运行:


八.二叉树的前序遍历(迭代算法)

题目链接:

144. 二叉树的前序遍历icon-default.png?t=O83Ahttps://leetcode.cn/problems/binary-tree-preorder-traversal/


题目描述:

        给你二叉树的根节点 root ,返回它节点值的 前序 遍历。


题目详情:


解题思路:

        本题的迭代算法即不使用递归来完成树的前序遍历,我们还是借助栈来完成,具体思路是,先访问左路结点,并将其存入vector,入栈,当左路走到底时,我们先将该根节点pop出栈, 再访问栈顶结点的右路。

        当我们来到右路时,把右路再当成一个新的根节点,同样先访问左路,并将其存入vector,入栈,当左路走到底时,我们先将该根节点pop出栈, 再访问栈顶结点的右路,就这样不断循环, 直到栈中所有元素pop完,代表这颗树已经全部按照先序存入vector中了。

        思路图示如下:


解题代码:

class Solution 
{
public:vector<int> preorderTraversal(TreeNode* root){stack<TreeNode*> st;vector<int> v;TreeNode* cur = root;while(cur || !st.empty()){//访问左路结点,左路结点入栈,后续依次访问左路节点的右子树while(cur){v.push_back(cur->val);st.push(cur);cur=cur->left;}//依次访问左路节点的右子树TreeNode* top = st.top();st.pop();cur = top->right;}return v;}
};

提交运行:


九.二叉树的中序遍历(迭代算法)

题目链接:

94. 二叉树的中序遍历icon-default.png?t=O83Ahttps://leetcode.cn/problems/binary-tree-inorder-traversal/


题目描述:

        给定一个二叉树的根节点 root ,返回 它的 中序 遍历


题目详情:


解题思路:

中序和先序的区别就是,先序是访问左子树前就将数据push进vector了,而中序遍历时我们是先将左子树访问完,再开始入vector.同样是借助栈来完成,区别仅在于向vector里push的时机.

解题代码:

class Solution 
{
public:vector<int> inorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> v;TreeNode* cur = root;while(cur || !st.empty()){//访问左路结点,左路结点入栈,后续依次访问左路节点的右子树while(cur){st.push(cur);cur=cur->left;}//依次访问左路节点和其右子树TreeNode* top = st.top();st.pop();v.push_back(top->val);cur = top->right;}return v;}
};

提交运行:


十.二叉树的后序遍历(迭代算法)

题目链接:

145. 二叉树的后序遍历icon-default.png?t=O83Ahttps://leetcode.cn/problems/binary-tree-postorder-traversal/


题目描述:

        给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历


题目详情:


解题思路:

        对于后序遍历而言,我们要先了解一个概念:

        因此我们后序遍历时插入vector的时机就是在上一次访问到是它的右节点时表示是最后一次访问了的时候,才将其Push进vector中,这样得到的vector就是按照后序遍历的结果了。


解题代码:

class Solution 
{
public:vector<int> postorderTraversal(TreeNode* root) {stack<TreeNode*> st;TreeNode* prev =nullptr;TreeNode* cur = root;vector<int> v;while(cur || !st.empty()){while(cur){st.push(cur);cur=cur->left;}TreeNode* top = st.top();//一个结点右子树为空,或者上一个访问的结点是右子树,那么说明是最后一次经过了//就可以访问了if(top->right == nullptr || top->right == prev){prev = top;v.push_back(top->val);st.pop();}else{cur = top->right;}}return v;}
};

提交运行:


结语

        希望通过上面的题目能使大家对二叉树的理解以及运用能够更上一层楼,欢迎大佬们留言或私信与我交流.学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【数据结构】什么是二叉搜索(排序)树?

【数据结构】C语言实现链式二叉树(附完整运行代码)

【C++】模拟实现priority_queue(优先级队列)

【C++】模拟实现queue

【C++】模拟实现stack

【C++】模拟实现list

【C++】模拟实现vector

【C++】模拟实现string类

【C++】构建第一个C++类:Date类

【C++】类的六大默认成员函数及其特性(万字详解)

【C++】什么是类与对象?


相关文章:

【C++】10道经典面试题带你玩转二叉树

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Leetcode/牛客网 目录 一.根据二叉树创建字符串 二.二叉树的层序遍历 三.二叉树的层序遍历 II 四.二叉树的最近公共祖先 五.二叉搜索树与双向链表 六.从前序与中序遍历序列构造二叉树 七.从中序与后序遍历…...

【裸机装机系列】13.kali(ubuntu)-优化-自定义grub启动界面个性化背景

推荐阅读&#xff1a; 1.kali(ubuntu)-为什么弃用ubuntu&#xff0c;而选择基于debian的kali操作系统 当裸机安装了linux之后&#xff0c;开机的时候总会让人误会是黑客&#xff0c;还是优化一下开机界面吧&#xff0c;毕竟是日常开发使用。 注&#xff1a;修改有grub启动项有…...

数组高阶应用(C++版)

在C中&#xff0c;普通的数组&#xff08;C-style array&#xff09;、std::initializer_list 、 std::array和std::vector 是四种不同的容器类型&#xff0c;它们各自有不同的特性和用途。下面是对它们进行详细比较和解释。 1. 普通数组&#xff08;C-style Array&#xff09…...

Spring(四)多线程+异步任务执行服务+常见的Enable注解+SpringUnit测试

Spring多线程 Spring通过任务执行器&#xff08;TaskExecutor&#xff09;来实现多线程和并发编程ThreadPoolTaskExecutor实现一个基于线程池的TaskExecutor配置类中EnableAsync开启对异步任务的支持使用Async声明该任务为异步 ①、配置类 Configuration ComponentScan(&quo…...

解析与实现二叉树

在数据结构与算法的学习中&#xff0c;二叉树无疑是一个重要且实用的数据结构。它不仅在理论上具有深刻的研究价值&#xff0c;更在实际应用中广泛存在&#xff0c;如搜索引擎的索引结构、文件系统的目录树、数据库的索引、游戏开发中的场景管理等等。本文将深入探讨二叉树的基…...

Java面向对象——内部类(成员内部类、静态内部类、局部内部类、匿名内部类,完整详解附有代码+案例)

文章目录 内部类17.1概述17.2成员内部类17.2.1 获取成员内部类对象17.2.2 成员内部类内存图 17.3静态内部类17.4局部内部类17.5匿名内部类17.5.1概述 内部类 17.1概述 写在一个类里面的类叫内部类,即 在一个类的里面再定义一个类。 如&#xff0c;A类的里面的定义B类&#x…...

操作系统笔记三

进程 把一个静态程序通过OS在内存中让cpu执行起来的动态执行过程叫进程 写代码都是用户态&#xff0c;而进程在执行过程中需要完成特定的功能&#xff0c;这些功能呢只有操作系统能提供&#xff0c;比如说读写文件&#xff0c;读写文件的过程是与硬盘打交道&#xff0c;这个过程…...

uniapp快速入门教程,内容来源于官方文档,仅仅记录快速入门需要了解到的知识点

uniapp快速入门教程&#xff0c;内容来源于官方文档&#xff0c;仅仅记录快速入门需要了解到的知识点 目录 介绍uniapp 介绍uniapp x 介绍功能框架图创建项目&发布组件/标签的变化js的变化css的变化工程结构和页面管理 pages.jsonmanifest.json 应用配置组件easycom组件规…...

基于微信小程序的商品展示+ssm(lw+演示+源码+运行)

商品展示系统 摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;微信小程序被用户普遍使用&#xff0c;为方…...

【Linux】常用指令(下)(内含more、less、 head、tail、date、find、grep、zip、tar以及学习笔记)

文章目录 前言1. more指令2. less指令&#xff08;重要&#xff09;3. head指令4. tail指令5. 管道&#xff08;做到学会使用即可&#xff09;6. date指令6.1 时间戳 7. cal指令8. find指令9. grep指令10. zip/unzip指令11. tar指令 前言 Linux下的常用指令终于要在本文落下帷…...

DesignMode__unity__抽象工厂模式在unity中的应用、用单例模式进行资源加载

目录 抽象工厂模式 思维导图 接口&#xff08;抽象类&#xff09; 工厂接口 抽象产品类 抽象武器接口 抽象人物接口 具体工厂和具体产品 具体工厂 &#xff08;1&#xff09;产品接口&#xff0c;生成具体人物 &#xff08;2&#xff09;武器接口&#xff0c;生成具体…...

Leetcode3289. 数字小镇中的捣蛋鬼

Every day a Leetcode 题目来源&#xff1a;3289. 数字小镇中的捣蛋鬼 解法1&#xff1a;哈希 代码&#xff1a; /** lc appleetcode.cn id3289 langcpp** [3289] 数字小镇中的捣蛋鬼*/// lc codestart class Solution { public:vector<int> getSneakyNumbers(vector…...

13_Python的高阶函数

高阶函数 高阶函数是Python编程中一个非常强大和有用的特性&#xff0c;它们允许程序员编写更简洁、更抽象的代码。 Python中的高阶函数是那些至少满足以下一个条件的函数&#xff1a; 接受一个或多个函数作为输入&#xff08;也就是说&#xff0c;它的参数之一是函数&#…...

清空当前机器所有Docker容器和镜像

sudo docker stop $(sudo docker ps -aq) sudo docker rm $(sudo docker ps -aq) sudo docker rmi $(sudo docker images -q)删除当前机器上的所有Docker镜像是一个高风险操作&#xff0c;因为它会删除所有镜像&#xff0c;包括那些可能正在被容器使用的镜像。在执行此操作之前…...

FreeRTOS学习——Systick中断、SVC中断、PendSV中断

FreeRTOS学习——接口宏portmacro.h&#xff0c;仅用于记录自己阅读与学习源码 FreeRTOS Kernel V10.5.1 port &#xff1a;GCC/ARM_CM7 文章目录 Systick源码触发方式 SVC源码触发方式 PendSV源码触发方式 相关汇编指令 Systick 源码 在Systick中断xPortSysTickHandler中&am…...

汇量科技大数据面试题及参考答案

如何在 SQL 中处理三个字段完全一样的去重?在 Scala 中又该如何实现? 在 SQL 中,可以使用多种方法来处理三个字段完全一样的去重。一种常见的方法是使用 DISTINCT 关键字结合多个字段来实现。例如,假设有表 table_name,包含字段 field1、field2 和 field3,可以使用以下 S…...

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——14.AVL树

1.AVL 树 1.1AVL 树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查 找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962…...

Python 的数据类型与操作

一、常用内置类型&#xff08;Built - in Types&#xff09; Python 拥有多种内置数据类型&#xff0c;这些类型满足了各种编程需求&#xff0c;从简单的数据存储到复杂的数据结构表示。 1. 数值类型&#xff08;Numeric Types&#xff09; 整数&#xff08;int&#xff09;&a…...

Python燃烧废气排放推断算法模型

&#x1f3af;要点 宏观能耗场景模型参数化输入数据&#xff0c;分析可视化输出结果&#xff0c;使用场景时间序列数据模型及定量和定性指标使用线图和箱线图、饼图、散点图、堆积条形图、桑基图等可视化模型输出结果根据气体排放过程得出其时间序列关系&#xff0c;使用推断模…...

Qt中多语言的操作(以QtCreator为例)

1、首先&#xff0c;我们在代码中与文本相关的且需要支持多语言的地方&#xff0c;用tr来包含多语言key&#xff08;多语言key是我们自己定义的&#xff09;&#xff0c;如下 //举例 QPushButton* btnnew QPushButton(this); btn->move(20,20); btn->resize(100,50); //…...

计算机毕业设计 社区医疗服务系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

html+css学习

html 元素 html元素是HTML的根元素&#xff0c;一个文档只能有一个&#xff0c;其他所有元素都是其后代元素 html有一个属性为lang&#xff0c;其作用是&#xff1a; 帮助语言合成工具确定要使用的发音帮助翻译工具确定要使用的翻译规则 当属性lang“en”则表示告诉其浏览器…...

2.gitlab ce 细粒度的权限控制

需求&#xff1a; 在提交merge reqeust时&#xff0c;必须指定审核人&#xff0c;并且要选审核人清单里的 有个code owners应该可以做到&#xff08;gitlab ce应该也可以用&#xff09; 下面是参考的文档 细粒度的代码权限怎么做&#xff1f;极狐GitLab 代码所有者来帮忙 -…...

G - Merchant Takahashi / F - Useless for LIS

G - Merchant Takahashi 首先考虑暴力 DP。 设最后一步走到编号 ii 的城镇的方案的最大收益为 fifi​&#xff0c;则每次集市相当于是 fTi←fj−C∣Ti−j∣Pi&#xff08;1≤j≤n&#xff09;。 这样每次可以通过枚举 j 来转移&#xff0c;这样总时间复杂度是 O(nm) 的&…...

自然语言处理实例

引子:基于聊天机器人项目的自然语言处理(NLP)学习路线 自然语言处理(Natural Language Processing,简称 NLP)是人工智能的重要分支,旨在帮助计算机理解、生成和处理人类语言。NLP 技术广泛应用于搜索引擎、机器翻译、语音识别、文本摘要、情感分析、对话系统等领域。为…...

『功能项目』主角属性值显示【75】

本章项目成果展示 我们打开上一篇74穿戴装备的项目&#xff0c; 本章要做的事情是制作主角属性界面&#xff0c;实现在面板上显示主角的攻击力等数值 制作一个简易的主角界面&#xff08;创建Image与Text显示即可&#xff09; 创建一个空物体 重命名为PlayerInfo 在其子级下创…...

单片机嵌入式编程中常用技术点

Open CV&#xff0c;QT&#xff0c;Linux&#xff0c;多线程&#xff0c;网络编程&#xff0c;文件编程在单片机嵌入式编程中&#xff0c;这些技术在单片机嵌入式编程中的作用&#xff1a; 一、OpenCV 在单片机嵌入式编程中&#xff0c;虽然单片机的计算能力相对有限&#xf…...

【毕业论文+源码】基于ASP+NET的人事管理系统

引言 人事管理系统是针对企业内部人事管理设计&#xff0c;分角色实现对公司部门及各部门员工的增、删、改、查以及对员工考勤的管理。 编写目的&#xff1a; 在系统需求分析的基础上&#xff0c;对需求分析中产生的功能模块进行过程描述&#xff0c;设计功能模块的内部细节&…...

计算机毕业设计 校园志愿者管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

速通LLaMA2:《Llama 2: Open Foundation and Fine-Tuned Chat Models》全文解读

文章目录 概览LLaMA和LLaMA2的区别AbstractIntroductionPretrainingFine-tuning1. 概括2、Supervised Fine-Tuning&#xff08;SFT&#xff09;3、⭐Reinforcement Learning with Human Feedback&#xff08;RLHF&#xff09;&#x1f53a;总览Training Objectives&#xff1a;…...