day17 | 654.最大的二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

文章目录

    • 一、最大的二叉树
    • 二、合并二叉树
    • 三、二叉搜索树中的搜索
    • 四、验证二叉搜索树

一、最大的二叉树

654.最大的二叉树
构建二叉树的题目,都用前序遍历。
因为我们一定要先构建根节点,才能继续向后构建。

递归函数的参数和返回值:

TreeNode* constructMaximumBinaryTree(vector<int>& nums) {}

终止条件:

if (nums.size() == 1)return new TreeNode(nums[0]);

单层递归逻辑:

TreeNode *node = new TreeNode(maxVal);
if (maxValueIndex > 0)
{vector<int> newVec(nums.begin(), nums.begin() + maxValueIndex);node->left = constructMaximumBinaryTree(newVec);
}
if (maxValueIndex < nums.size() - 1)
{vector<int> newVec(nums.begin() + maxValueIndex + 1, nums.end());node->right = constructMaximumBinaryTree(newVec);
}
return node;

完整代码:


class Solution
{
public:TreeNode *constructMaximumBinaryTree(vector<int> &nums){if (nums.size() == 1)return new TreeNode(nums[0]);// 单层递归// 找到数组中最大的值和对应的下标int maxVal = 0;int maxValueIndex = 0; // 最大值所在下标 为啥要存下标呢? 因为下层递归分割的时候,需要使用下标来分割数组for (int i = 0; i < nums.size(); i++){if (nums[i] > maxVal){maxVal = nums[i];maxValueIndex = i;}}TreeNode *node = new TreeNode(maxVal);if (maxValueIndex > 0){vector<int> newVec(nums.begin(), nums.begin() + maxValueIndex);node->left = constructMaximumBinaryTree(newVec);}if (maxValueIndex < nums.size() - 1){vector<int> newVec(nums.begin() + maxValueIndex + 1, nums.end());node->right = constructMaximumBinaryTree(newVec);}return node;}
};

为啥会有两个判断? if (maxValueIndex > 0) if (maxValueIndex < nums.size() - 1)

因为要保证划分的左右区间至少都有一个值。

二、合并二叉树

617.合并二叉树
使用前序是最容易理解的。

class Solution
{
public:TreeNode *mergeTrees(TreeNode *t1, TreeNode *t2){if (t1 == nullptr)return t2;if (t2 == nullptr)return t1;// 单层递归逻辑// 复用 t1 的结构t1->val += t2->val;t1->left = mergeTrees(t1->left, t2->left);t1->right = mergeTrees(t1->right, t2->right);return t1;}
};

三、二叉搜索树中的搜索

700.二叉搜索树中的搜索
利用二叉搜索树的性质。(根的值大于左子树,小于右子树)

class Solution
{
public:TreeNode *searchBST(TreeNode *root, int val){if (root == nullptr)return nullptr;if (root->val == val)return root;// 单层递归逻辑TreeNode *res;// 若子树中出现了目标值,那么我们需要一个变量来返回我们的节点if (val < root->val)res = searchBST(root->left, val);if (val > root->val)res = searchBST(root->right, val);return res;}
};

四、验证二叉搜索树

98.验证二叉搜索树

在这里插入图片描述

我们遇到二叉搜索树中搜索类的题目,大概率是需要用到中序遍历的。

最为简单和直观的一种解法:

class Solution
{
public:vector<int> v;void inorder(TreeNode *root){if (root == nullptr)return;inorder(root->left);v.push_back(root->val);inorder(root->right);}bool isValidBST(TreeNode *root){// 把中序遍历的结果放入vector中,遍历这个vector,看它是否是升序的inorder(root);for (int i = 1; i < v.size(); i++){if (v[i] > v[i - 1]){continue;}else{return false;}}return true;}
};

定义一个pre来帮助比较:

class Solution
{
public:TreeNode *pre = nullptr;bool isValidBST(TreeNode *root){if (root == nullptr)return true;// 单层递归逻辑bool left = isValidBST(root->left);if (pre != nullptr && pre->val >= root->val)return false;pre = root;// 记录前一个节点,每次递归都要更新prebool right = isValidBST(root->right);return left && right;}
};

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

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

相关文章

AssetBundle学习

官方文档&#xff1a;AssetBundle 工作流程 - Unity 手册 (unity3d.com) 之前写的博客&#xff1a;AssetBundle学习_zaizai1007的博客-CSDN博客 使用流程图&#xff1a; 1&#xff0c;指定资源的AssetBundle属性 &#xff08;xxxa/xxx&#xff09;这里xxxa会生成目录&…

redux-promise-middleware和applyMiddleware的理解与使用

一、作用&#xff1a; applyMiddleware是一个中间件&#xff0c;通常和applyMiddleware结合使用&#xff0c;是dispatch与reducers之间的应用&#xff0c;用于处理dispatch发送的异步action操作 二、使用 1、安装redux-promise-middleware cnpm i redux-promise-middleware…

Micropython STM32F4入门点灯第一课

Micropython STM32F4入门点灯第一课 &#x1f4cc;固件刷可参考前面一篇《STM32刷Micropython固件参考指南》&#x1f4cd;固件下载&#xff1a;https://micropython.org/download/?mcustm32f4&#x1f516;本例程基于STM32F4DISC&#xff0c;主控芯片STM32F407VGT6&#x1f4…

vue 混入(mixin)的使用

在 vue 组件内&#xff0c;如果想将一些公共功能&#xff0c;如组件、方法、钩子函数等复用&#xff0c;混入是一个很好的选择。 现在开始我们的混入使用吧 1、我们可以创建一个目录mixins&#xff0c;在创建一个comment.js文件如图&#xff1a; // 在 common.js 里写你想共享…

20230803激活手机realme GT Neo3

20230803激活手机realme GT Neo3 缘起&#xff1a; 新买的手机&#xff1a;realme GT Neo3 需要确认&#xff1a; 1、4K录像&#xff0c;时间不限制。 【以前的很多手机都是限制8/10/12/16分钟】 2、通话自动录音 3、定时开关机。 4、GPS记录轨迹不要拉直线&#xff1a;户外助…

小程序学习(四):WXML模板语法

WXML模板语法-数据绑定 1.数据绑定的基本原则 ①在data中定义数据 ②在WXML中使用数据 2.动态绑定属性 WXML模板语法-事件绑定 3.什么是事件 4.小程序中常用的事件 5.事件对象的属性列表 6.target和currentTarget的区别 7.bindtap的语法格式 8.在事件处理函数中为data中的数据…

DC-2靶机

文章目录 信息收集漏洞发现漏洞利用 DC-2介绍 DC-2环境下载 请注意&#xff0c;您需要将渗透测试设备上的 hosts 文件设置为&#xff1a; 192.168.0.145 dc-2 显然&#xff0c;将 192.168.0.145 替换为 DC-2 的实际 IP 地址。 它将使生活变得更加简单&#xff08;如果没有它&am…

LeetCode513. 找树左下角的值

513. 找树左下角的值 文章目录 [513. 找树左下角的值](https://leetcode.cn/problems/find-bottom-left-tree-value/)一、题目二、题解方法一&#xff1a;递归法&#xff08;层序遍历&#xff0c;深度优先搜索&#xff09;**不足之处以及如何改进** 方法二&#xff1a;迭代 一、…

Gitignore忽略文件

默认情况下&#xff0c;Git会监视我们项目中的所有内容&#xff0c;但是有些内容比如mode_modules中的内容&#xff0c;我们不希望他被Git所管理。 我们可以在我们项目目录中添加一个 .gitignore 文件来设置那些需要git忽略的文件。

屏幕取色器Mac版_苹果屏幕取色工具_屏幕取色器工具

Sip for Mac 是Mac系统平台上的一款老牌的颜色拾取工具&#xff0c;是设计师和前端开发工作者必不可少的屏幕取色软件&#xff0c;你只需要用鼠标点一下即可轻松地对屏幕上的任何颜色进行采样和编码&#xff0c;并将颜色数据自动存到剪切板&#xff0c;方便随时粘贴出来。 Sip…

GPIO简介

一、GPIO GPIO&#xff08;General-purpose input/output&#xff09;即通用型输入输出&#xff0c;GPIO可以控制连接在其之上的引脚实现信号的输入和输出 芯片的引脚与外部设备相连&#xff0c;从而实现与外部硬件设备的通讯、控制及信号采集等功能 LED实验步骤 实验步骤 以L…

Spring事务传播机制、实现方式、失效场景即原理

贴一篇源码分析的好文章&#xff1a;https://blog.csdn.net/qq_30905661/article/details/114400417 本质&#xff1a; 一个事务对应一个数据库连接。 通过 this 来调用某个带有 Transactional 注解的方法时&#xff0c;这个注解是失效的&#xff0c;可以看做这个方法&#x…

Cocos Creator不规则按钮

实现该功能需要用到组件PolygonCollider2D&#xff0c;官方链接&#xff1a; https://docs.cocos.com/creator/3.4/manual/zh/physics-2d/physics-2d-collider.html 创建组件 创建一个精灵节点&#xff1a; 创建碰撞组件PolygonColider2D&#xff0c;如图 给按钮添加多边形碰…

链表的总体涵盖以及无哨兵位单链表实现——【数据结构】

&#x1f60a;W…Y&#xff1a;个人主页 在学习之前看一下美丽的夕阳&#xff0c;也是很不错的。 如果觉得博主的美景不错&#xff0c;博客也不错的话&#xff0c;关注一下博主吧&#x1f495; 在上一期中&#xff0c;我们说完了顺序表&#xff0c;并且提出顺序表中的问题 1. 中…

无涯教程-Lua - 函数声明

函数是一起执行任务的一组语句&#xff0c;您可以将代码分成单独的函数。 Lua语言提供了程序可以调用的许多内置方法。如方法 print()打印在控制台中作为输入传递的参数。 定义函数 Lua编程语言中方法定义的一般形式如下- optional_function_scope function function_name(…

一个SpringBoot 项目能处理多少请求?

这篇文章带大家盘一个读者遇到的面试题哈。 根据读者转述&#xff0c;面试官的原问题就是&#xff1a;一个 SpringBoot 项目能同时处理多少请求&#xff1f; 不知道你听到这个问题之后的第一反应是什么。 我大概知道他要问的是哪个方向&#xff0c;但是对于这种只有一句话的…

Django实现音乐网站 ⑵

使用Python Django框架制作一个音乐网站&#xff0c;在系列文章1的基础上继续开发&#xff0c;本篇主要是后台歌手表模块开发。 目录 表结构设计 歌手表&#xff08;singer&#xff09;结构 创建表模型 设置图片上传路径 创建上传文件目录 生成表迁移 执行创建表 后台管…

艺术二维码 API 申请及使用

艺术二维码是一种创新的技术产品&#xff0c;它将二维码与美观的背景图像相结合&#xff0c;创造出既实用又美观的作品。它们不仅具有传统二维码的功能性&#xff0c;能被智能设备快速扫描识别&#xff0c;还加入了艺术元素&#xff0c;增强了视觉吸引力和品牌识别度。其中&…

jenkins使用gitlab标签发布

关于jenkins git parameter使用gitlab标签发布和分支发布的用法 手动配置的我就不说了&#xff0c;点点点就行&#xff0c;主要是说一下在pipeline里如何使用 通过分支拉取gitlab仓库代码 pipeline {agent anyenvironment {}parameters {gitParameter(branch: , branchFilte…

Sentinel dashboard的使用;Nacos保存Sentinel限流规则

Sentinel dashboard的使用 往期文章 Nacos环境搭建Nacos注册中心的使用Nacos配置中心的使用Sentinel 容灾中心的使用 参考文档 Sentinel alibaba/spring-cloud-alibaba Wiki GitHub 限流结果 下载sentinel-dashboard github地址&#xff1a;Sentinel/sentinel-dashboar…