最大二叉树

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:

  1. 创建一个根节点,其值为 nums 中的最大值。
  2. 递归地在最大值 左边 的 子数组前缀上 构建左子树。
  3. 递归地在最大值 右边 的 子数组后缀上 构建右子树。

返回 nums 构建的 最大二叉树 

示例 1:

输入:nums = [3,2,1,6,0,5]
输出:[6,3,5,null,2,0,null,null,1]
解释:递归调用如下所示:
- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5] 。- [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1] 。- 空数组,无子节点。- [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1] 。- 空数组,无子节点。- 只有一个元素,所以子节点是一个值为 1 的节点。- [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 [] 。- 只有一个元素,所以子节点是一个值为 0 的节点。- 空数组,无子节点。

示例 2:

输入:nums = [3,2,1]
输出:[3,null,2,null,1]

提示:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 1000
  • nums 中的所有整数 互不相同

本题与昨天最后一道题基本一样,同样是构造二叉树,我们需要找到区间内的最大值,作为索引,再分出俩个区间。

注意:

1.使用前序遍历,即中左右的形式。

2.我们可以在参数中加入左右索引,在后续构造左右的递归的时候,可以不需要再次构造新的vector数组,从而节约时间。

 3.我们要考虑到每个区间内都至少包括1个元素,所以我们在左右的时候,要进行判断,区间是否存在元素。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* traversal(vector<int>& nums,int leftIndex,int rightIndex){int index = 0;int maxNumber = INT_MIN;for(int i= leftIndex;i<rightIndex;i++){if(nums[i]>maxNumber){maxNumber = nums[i];index = i;}}TreeNode* newNode = new TreeNode(maxNumber);if(index>leftIndex){newNode->left = traversal(nums,leftIndex,index);}if(index<rightIndex-1){newNode->right = traversal(nums,index+1,rightIndex);}return newNode;}TreeNode* constructMaximumBinaryTree(vector<int>& nums) {if(nums.size()==1)return new TreeNode(nums[0]);return traversal(nums,0,nums.size());}
};

合并二叉树

给你两棵二叉树: root1 和 root2 。

想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。

返回合并后的二叉树。

注意: 合并过程必须从两个树的根节点开始。

示例 1:

输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
输出:[3,4,5,5,4,null,7]

示例 2:

输入:root1 = [1], root2 = [1,2]
输出:[2,2]

提示:

  • 两棵树中的节点数目在范围 [0, 2000] 内
  • -104 <= Node.val <= 104

自己看这道题的时候,也想到了可以将root2这个二叉树加到root1中,但是没想到,如果root1的这个节点是null,但是root2相同节点非null,如何加进去。  

其实我们只需要分别判断cur1,cur2是否为空,如果为空的话,直接return另一个节点就可以,这样的话相当于把另一部分的子二叉树全部移动到了root1。

这个题的代码还是很简洁的。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* traversal(TreeNode* cur1, TreeNode* cur2){if(cur1==nullptr)return cur2;if(cur2==nullptr)return cur1;cur1->val+=cur2->val;cur1->left = traversal(cur1->left,cur2->left);cur1->right = traversal(cur1->right,cur2->right);return cur1;}TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {return traversal(root1,root2);}
};

二叉搜索树中的搜索

给定二叉搜索树(BST)的根节点 root 和一个整数值 val

你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。

示例 1:

输入:root = [4,2,7,1,3], val = 2
输出:[2,1,3]

示例 2:

输入:root = [4,2,7,1,3], val = 5
输出:[]

提示:

  • 树中节点数在 [1, 5000] 范围内
  • 1 <= Node.val <= 107
  • root 是二叉搜索树
  • 1 <= val <= 107

二叉搜索树,判断条件:如果节点为空或值为目标值 直接返回当前节点即可(为空 返回null;为目标值返回当前节点)

如果当前值大于目标值 ,next往右节点走;反之往左节点走。

迭代法更是简单的没边,一个while循环解决。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* traversal(TreeNode* cur, int value)//递归{if(cur==nullptr||cur->val==value)return cur;TreeNode* next = nullptr;if(value<cur->val) next = traversal(cur->left,value);if(value>cur->val) next  = traversal(cur->right,value);return next;}TreeNode* searchBST(TreeNode* root, int val) {return traversal(root,val);}
};


验证二叉搜索树 

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

输入:root = [2,1,3]
输出:true

示例 2:

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。

提示:

  • 树中节点数目范围在[1, 104] 内
  • -231 <= Node.val <= 231 - 1

这个题有一种解法,中序遍历,拿出所有的数放在vector容器中,判断这个容器是否为递增的,但这个效率不高。

还有就是我们不创造vector容器,直接在二叉树里判断。

我们定义一个treenode*  pre,中序遍历 ,左右就是拿到递归子树的bool值,最后判断是否全部为真;中就是判断pre和root 的val的关系,注意pre要非空。

我们呢可以理解为这个解法也是隐式创建了一个递增数组(但我们实际并没有创建,也就是没有消耗时间空间)我们的pre和root相当于双指针,pre始终在root的左侧位置,且紧挨着root,不断判断二者关系,要始终让root>pre,一旦一次不是,那就是false。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* pre = nullptr; bool traversal(TreeNode* root){if(root==nullptr)return true;bool left = traversal(root->left);if(pre!=nullptr&&pre->val>=root->val)return false;pre = root;bool right = traversal(root->right);return left&&right;}bool isValidBST(TreeNode* root) {return traversal(root);}
};

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

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

相关文章

天地图前端实现geoJson与wkt格式互转

geoJson与wkt都是WebGIS开发中经常用到的格式&#xff0c;天地图行政区划边界接口返回的是wkt格式数据&#xff0c;需要转换一下。 安装插件&#xff1a;terraformer/wkt npm install terraformer/wkt 两个函数&#xff1a; .wktToGeoJSON(WKT) ⇒ object.geojsonToWKT(Geo…

(1-7-3)数据库的基本查询

目录 1. 数据库的基本查询 1.1 简单的记录查询 1.2 使用列别名 2. 数据分页查询 &#xff08;1&#xff09;查询前五行数据 &#xff08;2&#xff09;查询 11 ~ 15 行数据 3. 结果集排序 3.1 单关键字排序 &#xff08;1&#xff09;升序排列 &#xff08;2&#…

宝塔配置pgsql可以远程访问及pdo_pgsql扩展的安装

本地navicat premium 17.0 可以远程访问pgsql v16.1宝塔的软件商店里&#xff0c;找到pgsql管理器&#xff1b;在pgsql管理器里找到客户端认证&#xff1a;第二步&#xff1a;配置修改&#xff0c;CtrlF 查找listen_addresses关键字&#xff1b;第三步&#xff1a;在navicat里配…

SQL进阶:自连接的用法

目录 一、可重排列、排列、组合 1、创建表 2、录入数据 3、获取可重排列的商品名称&#xff08;有序&#xff09; 4、获取排列的商品名称&#xff08;有序&#xff09; 5、获取组合的商品名称&#xff08;无序&#xff09; 6、获取3个元素的组合商品名称&#xff08;无序…

Spark集群优化配置指南

Spark集群优化配置指南 &#x1f4cb; 概述 本文档记录了5节点Spark集群的性能优化配置&#xff0c;主要解决Thrift Server内存不足(OOM)问题和CPU资源利用率低的问题。 文档内容 Spark架构原理: Driver与Executor的关系和工作机制Driver内存配置详解: 三个关键内存参数的作用和…

Layui —— select

前言&#xff1a;记录在修改bug时遇到的一些奇怪问题。遇到的奇怪问题1&#xff1a;项目中引入了 layui&#xff0c;而且也使用了 layui.use 按需导入了需要的组件&#xff0c;但是在页面每次刚初始化的时候去使用layui&#xff0c;控制台都会报 组件未定义的问题&#xff08;正…

代码随想录day32dp1

文章目录509. 斐波那契数70. 爬楼梯746. 使用最小花费爬楼梯确定dp数组&#xff08;dp table&#xff09;以及下标的含义 确定递推公式 dp数组如何初始化 确定遍历顺序 举例推导dp数组509. 斐波那契数 题目链接 文章讲解 class Solution { public:int fib(int n) {// 1. 确定…

RedisJSON 技术揭秘`JSON.ARRTRIM`用窗口裁剪,让数组保持“刚刚好”

1、指令速查 JSON.ARRTRIM <key> <path> <start> <stop>key&#xff1a;Redis 键名path&#xff1a;JSONPath&#xff0c;默认 $ 根&#xff1b;可用 .[*]/.. 多路径匹配start / stop&#xff1a;要保留的 [start, stop] 闭区间索引 支持负值&#xff…

fpga调试经验

fpga调试经验 调测场景&#xff1a; 外接adc传感器芯片&#xff0c;采集压力&#xff0c;温度等模拟量&#xff0c;fpga通过spi/i2c接口与adc传感器芯片通信 问题1&#xff1a;adc芯片在稳定环境中&#xff0c;输出数字量不稳定。 结论&#xff1a;adc输入电压由fpga板供应&…

cefSharp.WinForms.NETCore 138.xx (cef138/Chromium 138.0.7204.97) 升级测试体验

一、版本说明及变化 该版本支持cef138.0.x系列,cefsharp138.0.170 无重大更新;该版本暂不支持h264,请关注后续 关注栏目,关注我,学习cefsharp少走弯路 不迷路! CefSharp 设置缓存的注意事项参考 说明:栏目是订阅文章,无附件,如需要单独获取(看底部介绍说明) 该版本1…

chatgpt是怎么诞生的,详解GPT1到GPT4的演化之路及相关背景知识

人工智能革命正在发生&#xff0c;我们是何其幸运的一代&#xff0c;能亲眼见证人类/机器智能的大爆发。 仅仅作为这场革命的看客显然是有些遗憾的&#xff0c;如何进一步了解它&#xff1f; 本文将讨论chatgpt的诞生过程&#xff0c;串联起OpenAI发表的一系列重要论文&#…

[笔记] 动态 SQL 查询技术解析:构建灵活高效的企业级数据访问层

文章目录一. 应用场景二. 使用示例示例1示例2示例3三. 实现1. 动态表查询构建器&#xff0c;模仿MyBatis-Plus2. mapper3. mapper.xml功能概述参数说明四. 动态 SQL 的优化与风险防控在企业级应用开发中&#xff0c;数据查询场景往往呈现出复杂多变的特点 —— 从简单的单表筛选…

.net天擎分钟降水数据统计

1.需求&#xff1a;计算滑动时间下的1小时、3小时、6小时、12小时、24小时降水数据&#xff0c;统计这个时间下的分钟级降水数据2.分析第一版本&#xff1a;降水分钟级数据保存时间不长&#xff0c;保存太多意义不大&#xff0c;以更新的形式来保存这些统计数据效果会比较好&am…

图片合并pdf

文章目录 背景目标实现下载 背景 整合&#xff1a; 将零散的图片集合成一个单一文件。有序化&#xff1a; 固定图片的排列顺序。标准化&#xff1a; 转换为通用、兼容性强的PDF格式。高效管理&#xff1a; 便于存储、查找、分享和传输。正式化/文档化&#xff1a; 满足提交、报…

【vue3+js】文件下载方法整理

前端文件下载方式 引言 在前端开发中,文件下载是一个常见的需求。后端可能以不同的方式返回文件数据,前端需要根据不同的返回类型采用相应的处理方式。本文将总结几种常见的后端返回类型及对应的前端处理方案,主要基于Vue3和JavaScript环境。 一、后端返回文件URL 场景描…

MicrobiomeStatPlots | 森林图教程Forest plot tutorial

视频讲解https://www.bilibili.com/video/BV1mA3yzEEnc/森林图简介什么是森林图&#xff1f;参考&#xff1a;https://mp.weixin.qq.com/s/vwNf_sFlmhp7DeSYaQ3NxQ森林图是以统计指标和统计分析方法为基础&#xff0c;用数值运算结果绘制出的图形。它在平面直角坐标系中&#x…

vscode 打开项目时候,有部分外部依赖包找不到定义或者声明,但是能使用cmake正常编译并且运行

解决&#xff1a;是依赖路径的问题&#xff0c;先看includePath对不对&#xff0c;但是有时候会依赖外部文件&#xff0c;这时候入股cmake编译能够听过&#xff0c; 说明编译器能够找到依赖路径&#xff0c; 但是vscode的 IntelliSense 找不到依赖路径 → 导致编辑器提示错误、…

nginx:SSL_CTX_use_PrivateKey failed

SSL_CTX_use_PrivateKey("/home/nginx-vue/cret/*.com.key") failed (SSL: error:0B080074:x509 certificate routines:x509_check_private_key:key values mismatch) Nginx 尝试加载私钥文件时失败&#xff0c;原因是&#xff1a;证书与私钥不匹配 问题本质 SSL 证…

Docker 基于 Cgroups 实现资源限制详解【实战+源码】

本文将带你深入理解 Docker 如何借助 Linux Cgroups 实现对内存、CPU 等系统资源的精细化控制&#xff0c;并提供完整演示与图解、Compose 配置模板和资源包下载&#xff0c;适合初学者与工程师深入学习与实战。 文章目录 一、什么是 Cgroups&#xff1f;为什么对容器如此关键…

Linux中的系统日志(Rsyslog)

一、实验环境主机名系统网络适配器IP地址serverarhel9NAT模式172.25.254.11/24serverbrhel9NAT模式172.25.254.22/24二、Rsyslog的基本参数&#xff08;1&#xff09;安装rsyslog&#xff08;2&#xff09;rsyslog的服务名称&#xff08;3&#xff09;rsyslog的主配置文件rsysl…