二叉搜索树在线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://www.rhkb.cn/news/267082.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贝叶斯定理与条件独立假设:朴素贝叶斯分类方法深度解读

今天给大家分享的是朴素贝叶斯算法&#xff0c;这个算法在实际使用中不是很多&#xff0c;因为现在很多算法已经发展的很好&#xff0c;性能上也比朴素贝叶斯算法的好很多&#xff0c;因此在实际中我们其实看到在实际应用中朴素贝叶斯算法的使用已经比较少&#xff0c;即使出现…

高级语言期末2008级A卷(计算机学院)

1.编bool型函数&#xff0c;判断二维空间中的某点是否优于另一点。优于关系定义为&#xff1a;在二维空间中&#xff0c;某点&#xff08;A1&#xff0c;A2&#xff09;优于&#xff08;B1&#xff0c;B2&#xff09;&#xff0c;当且仅当A1>B1,A2>B2 #include <stdi…

【C++进阶】哈希(万字详解)—— 学习篇(上)

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…

Tomcat部署Web服务器及基础功能配置

前言 Tomcat作为一款网站服务器&#xff0c;目前市面上Java程序使用的比较多&#xff0c;作为运维工人&#xff0c;有必要了解一款如何去运行Java环境的网站服务。 目录 一、Java相关介绍 1. Java历史 2. Java跨平台服务 3. Java实现动态网页功能 3.1 servelt 3.2 jsp …

python统计分析——广义线性模型的评估

参考资料&#xff1a;用python动手学统计学 残差是表现数据与模型不契合的程度的重要指标。 1、导入库 # 导入库 # 用于数值计算的库 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 导入绘图的库 import matplotlib.pyplot as plt i…

AcWing 466. 回文日期

先贴个题目&#xff1a; 以及原题链接&#xff1a;466. 回文日期 - AcWing题库https://www.acwing.com/problem/content/468/ 这题乍一看有点恶心&#xff0c;如果枚举日期还要判断合法性&#xff0c;然后每个日期再判断是不是回文&#xff0c;即麻烦&#xff0c;时间复杂度又高…

day07_分类管理EasyExcel品牌管理

文章目录 1 分类管理1.1 菜单添加1.2 表结构介绍1.3 页面制作1.4 列表查询1.4.1 需求分析1.4.2 后端接口CategoryCategoryControllerCategoryServiceCategoryMapperCategoryMapper.xml 1.4.3 前端对接category.jscategory.vue 2 EasyExcel2.1 数据导入导出意义2.2 EasyExcel简介…

本地maven库缓存导入私库

为了加速编译代码&#xff0c;想将本地maven缓存导入内网私库使用。 脚本网上搜的 #!/bin/bash # copy and run this script to the root of the repository directory containing files # this script attempts to exclude uploading itself explicitly so the script name …

物体检测-系列教程19:YOLOV5 源码解析9 (Focus模块、Model类构造函数)

&#x1f60e;&#x1f60e;&#x1f60e;物体检测-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 13、Focus模块 13.1 基本流程 原始输入图像的格式为&#xff1a;tensor: float32[1,3,64…

Unity(第十八部)物理力学,碰撞,触发、关节和材质

1、重力 刚体组件 英文中文描述RigidBody刚体组件physics->rigidbody &#xff0c;刚体组件使一个物体有了质量&#xff0c;重力等。&#xff0c;use gravity 勾选后&#xff0c;物体才会受到重力&#xff0c;会自动下落&#xff0c;取消勾选就不会。&#xff0c;&#xf…

Unity中URP下实现水体(水面反射)

文章目录 前言一、原理1、法一&#xff1a;使用立方体纹理 CubeMap&#xff0c;作为反射纹理使用2、法二&#xff1a;使用反射探针生成环境反射图&#xff0c;所谓反射的采样纹理 二、实现水面反射1、定义和申明CubeMap2、反射向量需要什么3、计算 N ⃗ \vec{N} N 4、计算 V ⃗…

【力扣白嫖日记】550.游戏玩法分析IV

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 550.游戏玩法分析IV 表&#xff1a;Activity 列名类型player_idintdevice_idintevent_datedategames_played…

C语言--修饰符(auto、extern、static)与变量(局部变量+全局变量)和函数的关系

其中extern功能和用法上&#xff0c;比较特殊。先了解extern修饰全局变量&#xff0c;我总结为以下几点 为了方便描述&#xff0c;我创建了一个工程&#xff0c;工程包含了两个源文件&#xff0c;main.c和database.c **1&#xff09;&#xff1a;database.c中使用extern时用来…

Facebook的元宇宙实践:数字化社交的新前景

近年来&#xff0c;元宇宙&#xff08;Metaverse&#xff09;这一概念备受瞩目&#xff0c;被认为是数字化社交的未来趋势之一。而在众多科技巨头中&#xff0c;Facebook&#xff08;现更名为Meta&#xff09;一直处于元宇宙发展的前沿。在本文中&#xff0c;我们将深入探讨Fac…

Cesium插件系列——3dtiles压平

本系列为自己基于cesium写的一套插件具体实现。 这里是根据Cesium提供的CustomShader来实现的。 在CustomShader的vertexShaderText里&#xff0c;需要定义vertexMain函数&#xff0c;例如下&#xff1a; struct VertexInput {Attributes attributes;FeatureIds featureIds;…

NX二次开发:ListingWindow窗口的应用

一、概述 在NX二次开发的学习中&#xff0c;浏览博客时发现看到[社恐猫]和[王牌飞行员_里海]这两篇博客中写道有关信息窗口内容的打印和将窗口内容保存为txt,个人人为在二次开发项目很有必要&#xff0c;因此做以下记录。 ListingWindow信息窗口发送信息四种位置类型 设置Listi…

C语言学生成绩信息管理系统【结构体+文本】

功能描述&#xff1a; 1、录入成绩 2、显示不及格学生信息 3、统计每档学生数量 4、总成绩统计 代码&#xff1a; #include<stdio.h>#define N 30//结构体&#xff1a;typedef struct STUDENT{char id[10];//学号char name[20];//姓名float score[3];//三门成绩,分别代…

用node或者vscode开启一个简单的本地server服务器,加载html网页

使用Live Server 想要加载本地html页面可以快速能让它在你本地浏览器中打开&#xff0c;可以有好多种方式&#xff0c;如果你有使用vscode&#xff0c;可以安装一个插件&#xff1a;Live Server&#xff0c;然后直接在vscode中直接右键就可以开启这个服务&#xff1a; 安装好之…

新一代湖仓集存储,多模型统一架构,高效挖掘数据价值

星环科技TDH一直致力于给用户带来高性能、高可靠的一站式大数据基础平台&#xff0c;满足对海量数据的存储和复杂业务的处理需求。 同时在易用性方面持续深耕&#xff0c;降低用户开发和运维成本&#xff0c;让数据处理平民化&#xff0c;助力用户以更便捷、高效的方式去挖掘数…

Springboot 项目读取yaml的配置文件信息给静态方法使用,以及通过配置 ResourceBundle 类读取config.properties

读取yaml 的配置文件 配置文件信息 iot_saas_tenement:user_id: 7........8d9bprivate_key: MII.......qQbj_url: http://4.....5:8088project_name: iot_s.......rojectdevice_name: te.....ice 创建一个类 ProxyProperties 读取配置文件信息&#xff0c;并对外提供get方法 …