代码随想录算法训练营29期Day20|LeetCode 654,617,700,98

   文档讲解:最大二叉树  合并二叉树  二叉搜索树中的搜索  验证二叉搜索树

654.最大二叉树

题目链接:https://leetcode.cn/problems/maximum-binary-tree/description/

思路:

        本题目要求我们根据已知数组构建一颗最大二叉树,最大值为根节点,最大值左边区间构建左子树,最大值右边区间构建右子树。

        很容易我们就能想到这道题目要用递归来实现,因为针对每个区间我们的操作都是相同的:先寻找最大值构建根节点,再分割左右区间构建左右子树。因此我们对总区间 [0,n-1] 进行递归处理,递归边界条件为 l==r-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 {
private:TreeNode* createTree(vector<int>& nums,int l,int r){if(l>=r||l<0||r>nums.size()) return NULL;int maxval=l;for(int i=l;i<r;i++)if(nums[i]>nums[maxval]) maxval=i;TreeNode* cur=new TreeNode(nums[maxval]);cur->left=createTree(nums,l,maxval);cur->right=createTree(nums,maxval+1,r);return cur;}
public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {return createTree(nums,0,nums.size());}
};

617.合并二叉树

题目链接:https://leetcode.cn/problems/merge-two-binary-trees/description/

思路:

        本题要求我们将两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。

        我们从根节点开始,考虑每个节点的情况,分别处理即可,分析以后会发现很简单。

        我们先假设两棵树为树1和树2,当前处理到的位置相同的点为cur1和cur2,其中cur1为树1的节点,cur2为树2的节点。下面我们分类讨论:

        1.如果cur1和cur2都是空节点,那么新树中这个点必定为空,就不用向下处理了,向下肯定也是空的,因为下面已经没有点了。

        2.如果cur1是空节点,cur2不是空节点,那么新树中以当前位置这个点为根节点的子树,其构造必定和树2中以cur2为根节点的子树完全一致,因为cur1是空的,那么树1以cur1为根节点的子树也必定为空,那就不会向cur2那颗子树合并,或者说合并后还是cur2那颗子树,所以我们返回cur2即可,也不必再向下构造了。

        3.如果cur1不是空节点,cur2是空节点,那么这种情况与2重复,同样的处理方式即可,不过这次返回的是cur1这棵子树,或者说树1的cur1节点。

        4.如果cur1和cur2都不是空节点,那么我们将其值合并,变成新节点赋给新树对应位置节点,然后分别递归处理左右儿子,左右儿子的情况又回到这四种情况中,判断是哪种情况处理即可。

核心代码:

/*** 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 {TreeNode* merge(TreeNode* cur1,TreeNode* cur2){if(!cur1&&!cur2) return NULL;if(!cur1) return cur2;if(!cur2) return cur1;cur1->val+=cur2->val;cur1->left=merge(cur1->left,cur2->left);cur1->right=merge(cur1->right,cur2->right);return cur1;}
public:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {return merge(root1,root2);}
};

700.二叉搜索树中的搜索

题目链接:https://leetcode.cn/problems/search-in-a-binary-search-tree/description/

思路:

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

        思路也很简单,递归向下搜索即可。每次判断当前节点的值与val的大小关系,如果val大,就向右子树去搜,如果val小,就向左子树去搜,搜到空节点或者值相等为止。值相等证明找到了,返回当前节点,空节点证明树中没有该值,返回空即可。

核心代码:

/*** 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 {
private:TreeNode* searchval(TreeNode* cur,int val){if(!cur) return NULL;else if(cur->val==val) return cur;else if(cur->val>val) return searchval(cur->left,val);else return searchval(cur->right,val);}
public:TreeNode* searchBST(TreeNode* root, int val) {return searchval(root,val);}
};

98.验证二叉搜索树

题目链接:https://leetcode.cn/problems/validate-binary-search-tree/description/

思路:

        本题目要求我们判断一棵树是否是一个有效的二叉搜索树。

        首先我们要知道,所谓的有效的二叉搜索树,就是说针对树中任意非空节点作为根节点来说,左子树的最大值小于根节点值,右子树的最小值大于根节点值。因此我们从根节点开始递归的处理每棵子树即可。

        我们可以开一个全局变量flag,记录整颗树是否合法。也就是递归的时候处理到不合法情况让flag值为false即可。递归结束后flag为true证明整颗树合法,反之则不合法。flag初始值为true。

        每层递归我们要做的事情如下:递归处理左子树的最大值和最小值,递归处理右子树的最大值和最小值。得到这四个值结合根节点值我们就可以判断整颗树是否合法,从而决定flag是否为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 {
private:bool flag=true;vector<int> isValid(TreeNode* cur){vector<int> nums;int minnum=cur->val,maxnum=cur->val;if(cur->left){vector<int> numl=isValid(cur->left);if(numl[0]<minnum) minnum=numl[0];if(numl[1]>maxnum) maxnum=numl[1];if(numl[1]>=cur->val){flag=false;}}if(cur->right){vector<int> numr=isValid(cur->right);if(numr[0]<minnum) minnum=numr[0];if(numr[1]>maxnum) maxnum=numr[1];if(numr[0]<=cur->val){flag=false;}}nums.push_back(minnum);nums.push_back(maxnum);return nums;}
public:bool isValidBST(TreeNode* root) {isValid(root);return flag;}
};

今日总结

        今日学习时长2h,题目不算难,但我的解法不算好,肯定有更好的解法,还没来得及看,因为这两天又要准备期末,先把期末过了再说。

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

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

相关文章

(菜鸟自学)搭建虚拟渗透实验室——安装Kali Linux

安装Kali Linux Kali Linux 是一种基于 Debian 的专为渗透测试和网络安全应用而设计的开源操作系统。它提供了广泛的渗透测试工具和安全审计工具&#xff0c;使安全专业人员和黑客可以评估和增强网络的安全性。 安装KaliLinux可参考我的另一篇文章《Kali Linux的下载安装以及基…

SpringBoot默认日志输出格式

logback.xml <?xml version"1.0" encoding"UTF-8"?> <!-- 配置文件每隔1分钟&#xff0c;就检查更新 --> <configuration scan"true" scanPeriod"60 seconds" debug"false"><!--SpringBoot的三个自…

HTML之CSS Animation 属性常用动画

引入下面的样式表后 -webkit-animation: tada 1s ease 0.3s infinite both;-webkit-animation: name duration timing-function delay iteration_count directionanimation 各个参数详细用法请看 https://www.w3school.com.cn/css/css3_animations.aspcubic-bezier 生成器 http…

python统计分析——操作案例(模拟抽样)

参考资料&#xff1a;用python动手学统计学 import numpy as np import pandas as pd from matplotlib import pyplot as plt import seaborn as snsdata_setpd.read_csv(r"C:\python统计学\3-4-1-fish_length_100000.csv")[length] #此处将文件路径改为自己的路…

数据结构(c)冒泡排序

本文除了最下面的代码是我写的&#xff0c;其余是网上抄写的。 冒泡排序 什么是冒泡排序&#xff1f; 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交…

【5G Modem】5G modem架构介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

概率论与数理统计————1.随机事件与概率

一、随机事件 随机试验&#xff1a;满足三个特点 &#xff08;1&#xff09;可重复性&#xff1a;可在相同的条件下重复进行 &#xff08;2&#xff09;可预知性&#xff1a;每次试验的可能不止一个&#xff0c;事先知道试验的所有可能结果 &#xff08;3&#xff09;不确定…

使用Spring Boot集成中间件:Kafka的高级使用案例讲解

使用Spring Boot集成中间件&#xff1a;Kafka的具体使用案例讲解 导言 在实际应用中&#xff0c;Kafka作为一种强大的分布式消息系统&#xff0c;广泛应用于实时数据处理和消息传递。本文将通过一个全面的使用案例&#xff0c;详细介绍如何使用Spring Boot集成Kafka&#xff…

matlab串口数据交互的使用

一、matlab将串口数据读取并储存到position中 delete(instrfindall);%注销系统之前已经打开的串口资源 clear s %清空s的数据 s serial(COM6,BaudRate,115200);%定义串口及波特率 fopen(s)%打开串口 fwrite(s,00AB,)%向串口写入读取电机位置指令 for i1:8 %共8个电机position…

JVM实战(15)——Full GC调优

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

气象能见度监测站的应用介绍

【TH-NJD10】能见度是反映大气透明度的一个重要指标&#xff0c;对于航空、航海、道路交通等领域具有重要意义。 一、气象能见度监测站的应用 交通气象服务 气象能见度监测站在交通气象服务中发挥着重要作用。在高速公路、机场、港口等交通枢纽&#xff0c;能见度监测数据对于交…

U盘格式化后数据能恢复吗?几个具体解决问题的答案

U盘是一种常见的存储设备&#xff0c;它可以方便我们携带各种文件和数据。但是&#xff0c;当我们不小心将U盘格式化了&#xff0c;里面的数据也将全部都消失。并且&#xff0c;对于一些拥有较多电脑操作技能的用户来讲&#xff0c;格式化删除的数据与普通右击删除的方式相比&a…

机器人制作开源方案 | 乒乓球自动拾取机器人

作者&#xff1a;刘众森、王森、王绘东、崔岳震、宋维鑫 单位&#xff1a;山东农业工程学院 指导老师&#xff1a;潘莹月、廖希杰 1. 场景调研 我们小组选择项目的任务方向乒乓球的捡取与存放&#xff0c;针对此问题我们研发了一款乒乓球自动拾取机器人。众所周知&#xff0…

【Unity】【VRTK】【Pico】如何快速在VRTK中引入带动画的PICO控制器

【背景】 之前的VRTK篇章中,我只介绍了Oculus,Open VR,SImulator这三种Rig的配置方法,那么Pico如何融合VRTK进行开发呢? 【需要的开发包】 先像一个正常PICO项目那样导入PICO的SDK到Unity。VRTK 4的Package导入器中搜Pico,可以导入一个Pico的Integration,导入后Projec…

238.【2023年华为OD机试真题(C卷)】火星文计算(模拟-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-火星文计算二.解题思路三.题解代码Python题解代…

python中none的替换方法:pandasnumpy

none的替换方法&#xff1a; 1.pandas # 将缺失的id值替换为None merged_df[id].fillna(None, inplaceTrue) #这行代码使用了Pandas库中的fillna方法&#xff0c;对DataFrame中的id列进行了填充操作。具体来说&#xff0c;它将该列中的缺失值用字符串None进行填充&#xff0c…

Python中的__add__()方法

在 Python 中&#xff0c;__add__() 是一个特殊方法&#xff08;magic method&#xff09;&#xff0c;用于定义对象之间的加法操作。当你使用 运算符对两个对象进行相加时&#xff0c;实际上会调用对象的 __add__() 方法。 下面是一个简单的例子&#xff0c;演示了 __add__()…

SpringCloud.03.网关Gateway

目录 网关Gateway的概念&#xff1a; 准备 使用 方式一 因为配置了网关所以可以直接通过gateway发送请求 方式二 修改配置前&#xff1a;http://localhost:8082/provider/run 方式三(动态路由) 导入配置类 网关Gateway的概念&#xff1a; Spring Cloud Gateway 是 Spri…

【网络工程师】NAT与动态路由

一、NAT网络地址转换 1、NAT&#xff1a;Network Address Translations 网络地址转换 2、ip地址问题&#xff1a;ipv4地址严重不够用了&#xff08;A、B、C类可以使用 D组播 E科研&#xff09; 3、解决&#xff1a;把IP地址分为了公网IP和私网IP 公网IP只能在公网上使用 私网…

LLM模型的generate和chat函数区别

在 Hugging Face 的 transformers 库中&#xff0c;GPT&#xff08;Generative Pre-trained Transformer&#xff09;类的模型有两个常用的生成文本的方法&#xff1a;generate 和 chat。这两个方法在使用上有一些区别。通常公司发布的 LLM 模型会有一个基础版本&#xff0c;还…