二叉搜索树在线OJ题讲解

二叉树创建字符串

在这里插入图片描述
在这里插入图片描述

我们首先进行题目的解读:
大概意思就是用()把每个节点的值给括起来,然后再经过一系列的省略的来得到最后的结果

大家仔细观察题目给出的列子就可以发现,其实这个题目可以大致分为三种情况:

1 节点的左孩子和右孩子都在,不能省略括号
2 节点没有左孩子只有右孩子,不能省略括号
3 节点没有右孩子只有左孩子,可以省略这个空节点的括号,用来区分第二种情况,保证了一个字符串只能对应一个二叉搜索树

就比如例1:
在这里插入图片描述

例子中给出的初步转化的字符串是没有经过省略的,其实4后面还要加上两个空括号才完美,这里题目有一点小误差

就比如节点2他的右孩子节点是空的,所以那个括号就要省略,4和3的两个括号都省略,就可以得到最后的结果了

代码如下:
我们首先定义一个字符串,如果根节点root为空,就直接返回这个空字符串,不为空先+=root内存储的val
如果root的左孩子节点或者root的右孩子节点不为空的话,就要把root的左孩子节点的val用括号括起来,就算左孩子为空这个括号也不能省略
如果root的右孩子不为空就要把root的右孩子用括号括起来,最后 返回时str即可

class Solution {
public:string tree2str(TreeNode* root) {string str;if(root==nullptr)return str;str+=to_string(root->val);if(root->left||root->right){ str+='(';str+=tree2str(root->left);str+=')';}if(root->right){str+='(';str+=tree2str(root->right);str+=')';}return str;}
};
二叉树的分层遍历


在这里插入图片描述
这个题目是一个典型的vector里面套vector(int)的题目,他最后返回的是双层结构
在这里插入图片描述
我们可以用到一个队列,这个队列用来存放节点,而双层的vector容器就用来存放层序遍历节点的val,最后返回

我们先将root节点放进队列,然后当他出来后,将他的左右孩子节点放入队列,只要队列不为空不就继续
在这里插入图片描述
完整代码如下:

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {queue<TreeNode*> q;vector<vector<int>> vv;if(root==nullptr)return vv;int levelsize=0;q.push(root);levelsize=q.size();while(!q.empty()){vector<int> v;while(levelsize--){TreeNode* node=q.front();q.pop();v.push_back(node->val);if(node->left)q.push(node->left);if(node->right)q.push(node->right);}vv.push_back(v);levelsize=q.size();}return vv;}
};


在这里插入图片描述
自底向上的层序遍历,我们就偷懒直接用上面的代码,用一个reverse函数反转即可:

将vv的迭代器反转

class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root) {queue<TreeNode*> q;vector<vector<int>> vv;if(root==nullptr)return vv;int levelsize=0;q.push(root);levelsize=q.size();while(!q.empty()){vector<int> v;while(levelsize--){TreeNode* node=q.front();q.pop();v.push_back(node->val);if(node->left)q.push(node->left);if(node->right)q.push(node->right);}vv.push_back(v);levelsize=q.size();}reverse(vv.begin(),vv.end());return vv;}
};
最近公共祖先

在这里插入图片描述
在这里插入图片描述
其实我们画图之后可以看到,公共祖先节点有几个很明显的特征:
如果一个节点在本节点的左子树,另一个在本节点的右子树上,那么这个节点就是那两个节点的公共祖先

如果两个节点都在一个节点的左或者右我们就用一个辅助函数来递归完成,都在左边或者右边那么两个节点之中有一个一定时他们两个节点的公共祖先
在这里插入图片描述
完整代码如下:

class Solution {
public:
//判断是否在这个树上
bool isintree(TreeNode* root,TreeNode* x)
{if(root==nullptr)return false;if(root==x)return true;return isintree(root->left,x)||isintree(root->right,x);
}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root==p||root==q)return root;bool pinleft=isintree(root->left,p);bool pinright=isintree(root->right,p);bool qinleft=isintree(root->left,q);bool qinright=isintree(root->right,q);//一个在左一个在右if((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 nullptr;}
};
二叉树搜索树转换成排序双向链表

在这里插入图片描述
我们观察可以看到,最后排序出来的双向链表是一个有序的链表,而二叉搜索树的中序遍历一定是一个有序的序列,所以我们在这里要定义一个中序遍历的函数来用到解题

我们需要用到一个辅助的prev节点,令cur的left为prev,如果prev不为空就令prev的right为cur即可
在这里插入图片描述

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* head=pRootOfTree;while(head&&head->left){head=head->left;}return head;}
};
前序中序还原二叉树

在这里插入图片描述
本题是根据前序和中序来构造二叉树,我们知道前序的第一个节点就是二叉树的根节点,而中序中根节点左边的就是左子树,右边为右子树,然后再遍历前序第二个节点,再次带入中序,前序的“根节点”能够将中序分为两个区间,分为区间后我们再递归两个区间
在这里插入图片描述

完整代码如下:

class Solution {
public:TreeNode* _buildTree(vector<int>& preorder,vector<int>& inorder,int& prei,int begin,int end){if(begin>end)return nullptr;TreeNode* root=new TreeNode(preorder[prei]);int rooti=begin;while(rooti<=end){if(inorder[rooti]==preorder[prei])break;elserooti++;}prei++;root->left=_buildTree(preorder,inorder,prei,begin,rooti-1);root->right=_buildTree(preorder,inorder,prei,rooti+1,end);return root;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int i=0;return _buildTree(preorder,inorder,i,0,inorder.size()-1);}
};
中序和后序还原二叉树

在这里插入图片描述
中序和后续构造二叉树就和前序和后续构造一样,转变一个思路:
但是要注意,由于后序是左右根,所以要先递归右在递归左

class Solution {
public:TreeNode* _buildTree(vector<int>& inorder, vector<int>& postorder,int& prei,int begin,int end){if(begin>end)return nullptr;TreeNode* root=new TreeNode(postorder[prei]);int rooti=begin;while(rooti<=end){if(inorder[rooti]==postorder[prei])break;elserooti++;}prei--;root->right=_buildTree(inorder,postorder,prei,rooti+1,end);root->left=_buildTree(inorder,postorder,prei,begin,rooti-1);return root;}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {int i= postorder.size()-1;return _buildTree(inorder,postorder,i,0,inorder.size()-1);}
};

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

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

相关文章

【OpenGL编程手册05】纹理渲染

目录 一、说明二、概述三、纹理环绕方式四、纹理过滤五、多级渐远纹理六、加载与创建纹理七、生成纹理八、应用纹理九、纹理单元练习 一、说明 我们已经了解到&#xff0c;我们可以为每个顶点添加颜色来增加图形的细节&#xff0c;从而创建出有趣的图像。但是&#xff0c;如果…

文本多分类

还在用BERT做文本分类&#xff1f;分享一套基于预训练模型ERNIR3.0的文本多分类全流程实例【文本分类】_ernir 文本分类-CSDN博客 /usr/bin/python3 -m pip install --upgrade pip python3-c"import platform;print(platform.architecture()[0]);print(platform.machine…

Linux--Redis 群集

9.1.1 关系型数据库与非关系型数据库 数据库按照其结构可以分为关系型数据库与其他数据库&#xff0c;而这些其他数据库我们将其统称为非 关系型数据库。Redis数据库是一个非关系型数据库。 1、关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型基础上…

MATLAB练习题:排队论问题的模拟

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 下面我们来看一道排队论的题目。假设某银行工作时间内只有一个…

硬盘坏了怎么把数据弄出来?数据恢复方法推荐

在数字化时代电脑硬盘中的数据承载着我们的工作成果、生活回忆和珍贵资料。然而一旦硬盘出现故障&#xff0c;数据的安全就变得岌岌可危。那么当电脑硬盘出现问题时&#xff0c;我们真的无法挽回那些重要数据了吗&#xff1f;答案是&#xff1a;不一定&#xff01;本文将为您介…

【GPU驱动开发】- AST简介

前言 不必害怕未知&#xff0c;无需恐惧犯错&#xff0c;做一个Creator&#xff01; AST&#xff0c;抽象语法树&#xff0c;是一种包含丰富语义信息的格式&#xff0c;其中包括类型、表达式树和符号等。 TranslationUnitDecl&#xff1a;该类表示一个输入源文件 ASTContext&…

Socket网络编程(六)——简易聊天室案例

目录 聊天室数据传输设计客户端、服务器数据交互数据传输协议服务器、多客户端模型客户端如何发送消息到另外一个客户端2个以上设备如何交互数据&#xff1f; 聊天室消息接收实现代码结构client客户端重构server服务端重构自身描述信息的构建重构TCPServer.java基于synchronize…

Android 12.0 framework关于systemUI定制之导航栏透明背景的功能实现

1.概述 在12.0的系统rom产品定制化开发中,在对于系统原生SystemUI的导航栏背景在沉浸式导航栏的 情况下默认是会随着背景颜色的变化而改变的,在一些特定背景下导航栏的背景也是会改变的,所以由于产品开发需要 要求需要设置导航栏背景为透明的,所以就需要在Activity创建的时…

第十五天-爬虫项目实战

目录 1.介绍 2.代码 1.main.py 2.PageSider.py 3.DetailSpider.py 4.DataParse.py 5.Constant.py 6.HanderRequest.py 1.介绍 1. 使用多线程爬取网站 2.爬取数据后保存至excel 3.爬取网站(仅做测试)网创类项目爬取&#xff1a;https://www.maomp.com/ 4..实现效果 …

Java已死?凛冽寒风,刺骨现实

文章首发于公众号&#xff1a;职谷智享 2024年&#xff0c;寒风凛冽&#xff0c;不仅吹进了人们的衣领&#xff0c;也吹进了程序员的心里。曾经风光无限的Java&#xff0c;如今似乎正在走向末路。 招聘需求骤减&#xff0c;求职者如过江之鲫 猎聘网的数据显示&#xff0c;20…

Linux 任务进程命令练习

1、通过ps命令的两种选项形式查看进程信息 2、通过top命令查看进程 3、通过pgrep命令查看sshd服务的进程号 4、查看系统进程树 5、使dd if/dev/zero of/root/file bs1M count8190 命令操作在前台运行 6、将第5题命令操作调入到后台并暂停 7、使dd if/dev/zero of/root/file2 bs…

Flutter中Future和Stream关系

Future和Stream类是Dart异步编程的核心。 Future 表示一个不会立即完成的计算过程。与普通函数直接返回结果不同的是异步函数返回一个将会包含结果的 Future。该 Future 会在结果准备好时通知调用者。 Stream 是一系列异步事件的序列。其类似于一个异步的 Iterable&#xff0c;…

力扣SQL50 大的国家 查询

Problem: 595. 大的国家 Code select name,population,area from World where area > 3000000 or population > 25000000;

国外站群服务器科普:定义、用途与价值

在数字化时代&#xff0c;服务器扮演着至关重要的角色&#xff0c;而站群服务器则是其中的一种特殊形态。尤其对于需要在全球范围内进行业务部署的企业或个人来说&#xff0c;国外站群服务器成为了不可或缺的工具。那么&#xff0c;国外站群服务器究竟是什么呢?它有哪些用途呢…

【Web安全靶场】sqli-labs-master 54-65 Challenges 与62关二分法和like模糊搜索

sqli-labs-master 54-65 Challenges 其他关卡和靶场见专栏… 文章目录 sqli-labs-master 54-65 Challenges第五十四关-联合注入第五十五关-联合注入第五十六关-联合注入第五十七关-联合注入第五十八关-报错注入第五十九关-报错注入第六十关-报错注入第六十一关-报错注入第六十…

抖音视频评论批量采集软件|视频数据提取工具

开发背景&#xff1a; 随着抖音视频的流行和使用频率增加&#xff0c;用户对批量采集抖音视频评论的需求逐渐凸显。传统的下载方式效率低下&#xff0c;无法满足快速采集数据的要求。为了解决这一问题&#xff0c;我们开发了一款基于C#的抖音视频评论批量采集软件&#xff0c;旨…

React富文本编辑器开发(三)

现在我们的编辑器显示的内容很单一&#xff0c;这自然不是我们的目标&#xff0c;让呈现的内容多元化是我们的追求。这就需要让编辑器能够接收多元素的定义。从初始数据的定义我们可以推断数据的格式远不止一种&#xff0c;那么其它类型的数据如何定义及呈现的呢&#xff0c;我…

kohya_ss, stable diffusion 显示MaxRetryError: HTTPSConnectionPool()的解决方法

说白了就是访问huggingface.co下载模型、json配置失败&#xff0c;需要挂梯子。 然而有时候明明开了梯子&#xff0c;网页端可以访问google、huggingface.co却依然报上述错。 这时候说明没有开代理&#xff0c;执行的脚本没有连接上梯子对应的端口。 解决办法&#xff1a;手…

【MySQL】数据库中常用的函数

目录 聚合函数COUNT()函数的多种用法COUNT(*)COUNT(主键)COUNT(1)COUNT(常量)COUNT(非主键)COUNT(distinct(字段)) COUNT()函数小结 字符函数length(str)函数&#xff1a;获取参数值的字节个数concat(str1,str2,...)函数&#xff1a;字符串拼接upper(str)、lower(str)函数:大小…

pdf.js使用步骤

使用pdfjs 网页在线预览需要后端服务器支持 1、下载PDF.js 源码包 地址&#xff1a;PDF.js 2、解压源码包&#xff0c;将源码包放置到后端服务器 3、后端部署完成后 访问 viewer.html 类似上图 4、访问在线pdf文件 http://localhost:8081/web/viewer.html?filexxxx.pdf …