【LeetCode】day17:654 - 最大二叉树, 617 - 合并二叉树, 700 - 二叉树搜索树中的搜索, 98 - 验证二叉搜索树

LeetCode 代码随想录跟练 Day17

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

654.最大二叉树

题目描述:

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。

在数组上构建二叉树,思路很直观,只需注意取到最大值后左右子树的边界,traverse使用left和right表示当前递归所使用到的数组的区间。代码如下:

class Solution {
private:TreeNode* traverse(vector<int>& nums, int left, int right) {if (left > right) return nullptr;int maxVal = nums[left];int maxIndex = left;for (int i = left + 1; i <= right; ++i) {if (nums[i] > maxVal) {maxVal = nums[i];maxIndex = i;}}TreeNode* root = new TreeNode(maxVal);root->left = traverse(nums, left, maxIndex - 1);root->right = traverse(nums, maxIndex + 1, right);return root;}public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {return traverse(nums, 0, nums.size() - 1);}
};

617.合并二叉树

题目描述:

给你两棵二叉树: 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]

实际上还是对二叉树的遍历,每次遍历的参数为两个二叉树各自位置的当前节点。不同的是在初值判断的过程中,若其中一个节点为空则直接返回另一个节点作为合并后的节点,其他过程使用前序遍历即可。代码如下:

class Solution {
public:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if (root1 == nullptr) return root2;if (root2 == nullptr) return root1;TreeNode* root = new TreeNode(root1->val + root2->val);root->left = mergeTrees(root1->left, root2->left);root->right = mergeTrees(root1->right, root2->right);return root;}
};

700.二叉搜索树中的搜索

题目描述:

给定二叉搜索树(BST)的根节点 root 和一个整数值 val。
你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。

二叉搜索树是指树中每个节点值均大于其左子树所有节点值并小于其右子树的所有节点值的二叉树。题目执行的搜索操作,根据迭代能够直观的找到结果:

class Solution {
public:TreeNode* searchBST(TreeNode* root, int val) {while (!root) {if (root->val == val) return root;else if (root->val > val) root = root->left;else if (root->val < val) root = root->right;}return nullptr;}
};

按照递归方法同二叉树递归框架:

class Solution {
public:TreeNode* searchBST(TreeNode* root, int val) {if (root == nullptr) return nullptr;if (root->val == val) {return root;} else if (root->val > val) {return searchBST(root->left, val);} else {return searchBST(root->right, val);}}
};

98.验证二叉搜索树

题目描述:

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

判断一个树是否是二叉搜索树最简单的逻辑:其左右子树是否是二叉搜索树,当前节点值是否大于左节点小于右节点。但是直接这样做会陷入一个局部解,对每个局部子树都是二叉搜索树的判断无法得出树整体是一个二叉搜索树,如下图
在这里插入图片描述
比如这里的两个子树都是二叉搜索树,但整体上根节点的左子树中有 5 > 3 5>3 5>3,不满足二叉搜索树的条件,所以在递归的同时需传入边界,向左子树前进时需传入根节点的值作为最大值的限制,向右子树前进时需传入根节点的值作为最小值的限制。代码如下:

class Solution {
private:bool traverse(TreeNode* root, long long min, long long max) {if (root == nullptr) return true;if (root->val <= min || root->val >= max) return false;return traverse(root->left, min, root->val) && traverse(root->right, root->val, max);}public:bool isValidBST(TreeNode* root) {return traverse(root, LONG_MIN, LONG_MAX);}
};

注意在判断时使用大于等于和小于等于(二叉搜索树中不能有相同元素)

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

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

相关文章

SpringBoot整合SSE,实现后端主动推送DEMO

前言 说起服务端主动推送&#xff0c;大家第一个想到的一定是WEBSOCKET 。 作为软件工程师&#xff0c;不能无脑使用一种技术&#xff0c;要结合实际情况&#xff0c;择优选取。 SSE&#xff08;Server-Sent Events&#xff09;相比于WEBSOCKET 1、轻量化、兼容性 基于传统…

用 AI 解决电脑问题、推荐电影、游戏攻略

担任电脑专家 prompt&#xff1a; 作为一名电脑专家&#xff0c;我拥有广泛的技能和知识来解决各种电脑问题。你的身份是围绕着为 用户提供电脑相关支持和解决疑难问题的专业人士。 你擅长于以下领域&#xff1a; 1. 硬件故障排除&#xff1a;你能够检测和修复与电脑硬件相关…

学懂C语言(十一): C语言哪些数据类型适合位运算操作?

目录 1. 整型数据类型 1.1 int 1.2 unsigned int 1.3 short 1.4 unsigned short 2. 字符型数据 2.1 char 2.2 unsigned char 3. 长整型数据 3.1 long 和 unsigned long 3.2 long long 和 unsigned long long 总结 位运算主要用于整型数据类型&#xff0c;因为这些类…

pytorch学习(十二)c++调用minist训练的onnx模型

在实际使用过程中&#xff0c;使用python速度不够快&#xff0c;并且不太好嵌入到c程序中&#xff0c;因此可以把pytorch训练的模型转成onnx模型&#xff0c;然后使用opencv进行调用。 所需要用到的库有&#xff1a; opencv 1.完整的程序如下 import torch from torch impo…

零基础STM32单片机编程入门(十七)SPI总线详解及RC522-NFC刷卡模块实战含源码

文章目录 一.概要二.SPI总线基本概念1.SPI总线内部框图2.总体特征3.通讯时序 三.RC522介绍1.NFC基本介绍2.RC522模块基本特点3.RC522模块原理图4.RC522模块SPI通讯时序 四.RC522模块读卡实验五.CubeMX工程源代码下载六.小结 一.概要 SPI总线是由Motorola公司提出&#xff0c;是…

05_解封装和解码

1. 基本概念 容器就是一种文件格式&#xff0c;比如flv、mkv、mp4等。包含下面5种流以及文件头信息。 流是一种视频数据信息的传输方式&#xff0c;5种流&#xff1a;音频&#xff0c;视频&#xff0c;字幕&#xff0c;附件&#xff0c;数据。 包在ffmpeg中代表已经编码好的一…

FPGA实验3:D触发器设计

一、实验目的及要求 熟悉Quartus II 的 VHDL 文本设计简单时序电路的方法&#xff1b; 掌握时序电路的描述方法、波形仿真和测试&#xff0c;特别是时钟信号的特性。 二、实验原理 运用Quartus II 集成环境下的VHDL文本设计方法设计简单时序电路——D触发器&#xff0c;依据…

ABC363 题解

ABC363 题解 A - Piling Up (模拟) 题意&#xff1a; 输入一个数字&#xff0c;数字介于 1 1 1- 99 99 99显示了一次^, 100 100 100- 199 199 199显示了^两次…增加显示的所需的最小的评分增幅 分析&#xff1a; 算比次数字大且为 100 100 100的倍数的最小值减此数字 代码…

三相PWM整流器滞环电流控制仿真matlab simulink

1、内容简介 略 88-可以交流、咨询、答疑 2、内容说明 略 三相&#xff30;&#xff37;&#xff2d;整流器已广泛应用工业与电气控制领域电流控制技术决定着三相&#xff30;&#xff37;&#xff2d;整流器系统的控制性能。综合比 较了各种电流控制方法应用较多的滞环比较…

C++ 类和对象 构造函数(下)

一 初始化列表&#xff1a; 1.1 构造函数体赋值&#xff1a; 在C中&#xff0c;构造函数用于创建对象并赋予其初始值。通常&#xff0c;我们可以在构造函数体内对成员变量进行赋值&#xff1a; class Date { public:Date(int year, int month, int day) {_year year;_mont…

golang 解压带密码的zip包

目录 Zip文件详解ZIP 文件格式主要特性常用算法Zip格式结构图总览Zip文件结构详解数据区本地文件头文件数据文件描述 中央目录记录区&#xff08;核心目录记录区 &#xff09;中央目录记录尾部区 压缩包解压过程方式1 通过解析中央目录区来解压方式2 通过读取本地文件头来解压两…

Java 环境配置——Java 语言的安装、配置、编译与运行

引言 Java 作为全球最广泛使用的编程语言之一&#xff0c;其强大的跨平台特性和丰富的生态系统&#xff0c;使其在企业级应用、移动开发、大数据处理等领域具有重要地位。正确配置 Java 开发环境是每一个 Java 开发者的必备技能。本文将详细介绍如何在不同操作系统上安装、配置…

CentOS7中的yum命令不可用,网络不可达

前言 我也搜了大量的文章&#xff0c;基本上都是 输入 vi /etc/sysconfig/network-scripts/ifcfg-ens33 (这个ens33 是上面图片对应的以太网卡的名称&#xff0c;有的可能是ifcfg-eth0) 将 ONBOOTno 改为 ONBOOTyes以及其他方法&#xff0c;但是都没用。 解决 具体原因我也…

Wpf和Winform使用devpress控件库导出Excel并调整报表样式

Wpf和Winform使用devpress控件库导出Excel并调整报表样式 背景 客户需求经常需要出各种报表&#xff0c;部分客户对报表的样式有要求。包括颜色、字体、分页等等。 代码 使用Datagridview导出excel调整样式 DevExpress.XtraGrid.Views.Grid.GridView gdv #region GridView…

2024“钉耙编程”杭电多校1006 序列立方(思维+前缀和优化dp)

来源 题目 Problem Description 给定长度为 N 的序列 a。 一个序列有很多个子序列&#xff0c;每个子序列在序列中出现了若干次。 小马想请你输出序列 a 每个非空子序列出现次数的立方值的和&#xff0c;答案对 998244353 取模。 你可以通过样例解释来辅助理解题意。 Input 第…

[言简意赅] Matlab生成FPGA端rom初始化文件.coe

&#x1f38e;Matlab生成FPGA端rom初始化文件.coe 本文主打言简意赅。 函数源码 function gencoeInitialROM(width, depth, signal, filepath)% gencoeInitialROM - 生成 Xilinx ROM 初始化格式的 COE 文件%% 输入参数:% width - ROM 数据位宽% depth - ROM 数据深度% s…

heic文件怎么转换成jpg?上百份文件转换3秒就能搞定(办公必备)

heic和jpg是两种不同的图片格式&#xff0c;平时整理图片素材时&#xff0c;如果需要将heic转为jpg格式&#xff0c;那么可以使用相关的heic图片转换工具。 ​ 为什么要将heic文件转换成jpg&#xff1f;虽然HEIC格式具有很多优点&#xff0c;但是目前并不是所有设备和应用程序…

好玩模拟游戏推荐:缺氧:眼冒金星 单机游戏分享

《缺氧》 是一款太空殖民模拟游戏。 在外太空岩深处&#xff0c;你手下的勤劳开拓者们需要熟练掌握科技&#xff0c;战胜新的陌生生命形式&#xff0c;以及利用难以置信的太空技术来生存。甚至&#xff0c;还有可能繁荣起来。 建立广阔的基地以及探索生存所需的资源&#xff1…

服务攻防_01数据库安全RedisCouchdbH2database

一、数据库-Redis-未授权RCE&CVE 1、未授权访问&#xff1a;CNVD-2015-07557 &#xff08;1&#xff09;漏洞描述 Redis默认情况下会绑定在6379端口 如果没有采取相关策略&#xff08;如添加防火墙规则阻止非信任来源IP访问&#xff09;&#xff0c;会将Redis暴露在公网…

设计模式(工厂模式,模板方法模式,单例模式)

单例模式&#xff1a; 确保一个类只有一个实例&#xff0c;并提供全局访问点。 单例模式举例&#xff1a; 配置信息类&#xff1a;用于存储应用程序的全局配置信息&#xff0c;例如数据库连接信息、日志配置等。 日志类&#xff1a;用于记录应用程序运行时的日志信息&#x…