代码随想录算法训练营第20天 |● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

文章目录

  • 前言
  • 654.最大二叉树
    • 思路
    • 方法一 递归法
    • 方法一2 老师的+优化递归法
  • 617.合并二叉树
    • 思路
    • 方法一 递归法
    • 方法二 迭代法
  • 700.二叉搜索树中的搜索
    • 思路
    • 方法一 递归法
    • 方法二 迭代法
  • 98.验证二叉搜索树
    • 思路
    • 方法一 使用数组
    • 方法二 不使用数组
      • 代码注意点:
    • 方法二 使用双指针优化
    • 方法三 递归法
  • 总结


前言

617,98只掌握了递归法

654.最大二叉树

在这里插入图片描述
在这里插入图片描述

思路

注意事项【本题简单,就这两个重要些儿】

  1. 使用前序遍历
  2. 可以在传入的时候传入数组和左右index而不是每次都复值一个数组的方式来节省空间开销。

老师在讲的思路和我下面有一点出入:
4. 他进入递归里面的nums不为空,长度大于等于1【题目给出的】,所以在切割左右数组的时候会加了限定index>0或者index<size-1,保证nums里面有元素才递归,我的方法会有空的情况【反正没错】。

方法一 递归法

下面是自己写的代码,一遍过,和昨天的一样思路,还比昨天的简单

class Solution(object):def constructMaximumBinaryTree(self, nums):""":type nums: List[int]:rtype: TreeNode"""if not nums: return Nonemax_val = max(nums) max_index = nums.index(max_val)node = TreeNode(val=max_val)#返回条件 叶子节点;本题中因为有了上面的None的情况,所以可以省略下面这一句判断if len(nums) == 1: return node# 单层递归逻辑#拆分左右left_tree = nums[:max_index]right_tree = nums[max_index+1:]node.left = self.constructMaximumBinaryTree(left_tree)node.right = self.constructMaximumBinaryTree(right_tree)return node

方法一2 老师的+优化递归法

思路:三步走

  1. 返回node
  2. 在这里插入图片描述
  3. 有3步
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

优化:没有必要每次传入的时候都是复值的一个新的小数组,只需要传入index的起止就可以了;

class Solution:def traversal(self, nums: List[int], left: int, right: int) -> TreeNode:if left >= right:return NonemaxValueIndex = leftfor i in range(left + 1, right):#不适用max和.index函数的写法。if nums[i] > nums[maxValueIndex]:maxValueIndex = iroot = TreeNode(nums[maxValueIndex])root.left = self.traversal(nums, left, maxValueIndex)root.right = self.traversal(nums, maxValueIndex + 1, right)return rootdef constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode:return self.traversal(nums, 0, len(nums))

617.合并二叉树

在这里插入图片描述
💌这是十分经典的二叉树题目;可以想想之前做过的对称二叉树;

思路

优先掌握递归法
总体思路:两棵树同步遍历+不是创建了一个新的二叉树,而是直接改的tree1;
三步递归法:

  1. 输入和返回值:输入两个tree,输出root
  2. 终止条件【💖十分巧妙】:如果t1为空,那么返回t2;如果t2为空,那就接t1
    • t1空了,肯定就是直接把后面的t2嫁接过来;当然t2为空也没有关系,那就接t2
  3. 单层逻辑:val为t1的val+t2的val;左节点为t1.left和t2.left递归之后的结果,右边也是。
  4. 补充:三种遍历顺序都是一样的

方法一 递归法

直接在t1上面处理,节省空间

class Solution(object):def mergeTrees(self, root1, root2):""":type root1: TreeNode:type root2: TreeNode:rtype: TreeNode"""if not root1:return root2if not root2:return root1root1.val += root2.valroot1.left = self.mergeTrees(root1.left,root2.left)root1.right = self.mergeTrees(root1.right,root2.right)return root1

方法二 迭代法

700.二叉搜索树中的搜索

在这里插入图片描述

思路

本题需要掌握递归法和迭代法,因为都很简单
在这里插入图片描述

方法一 递归法

三步走

  1. 传入root,传出一个是搜索数值对应的节点
  2. 终止条件:如果传入的为空的话,返回none;如果发现值相等target的话,也是直接返回root
  3. 单层递归条件:如果整个值小于root的值,进入左子树递归;大的话就是右子树
  4. 💘十分巧妙的点:终止条件里面两个可以合并,如果root==none,也是直接返回
class Solution(object):def searchBST(self, root, val):""":type root: TreeNode:type val: int:rtype: TreeNode"""if not root or root.val == val: return rootif root.val < val: result = self.searchBST(root.right)if root.val > val: result = self.searchBST(root.left)return result

方法二 迭代法

因为二叉搜索树的特性,所以很简单

class Solution:def searchBST(self, root: TreeNode, val: int) -> TreeNode:while root:if val < root.val: root = root.leftelif val > root.val: root = root.rightelse: return rootreturn None

98.验证二叉搜索树

## 题目
注意:二叉搜索树是不可以有重复的

思路

总体思路:使用中序遍历(前中后),那么遍历过程中的元素应该是单调递增的。

方法一 使用数组

方法一:定义一个全局变量list,遍历一次append一次,如果是递增数组就是对的
在这里插入图片描述

class Solution(object):def __init__(self):self.vec = []def traversal(self,root):if not root: return Trueself.traversal(root.left)self.vec.append(root.val)self.traversal(root.right)def isValidBST(self, root):""":type root: TreeNode:rtype: bool"""if not root: return Trueself.traversal(root)for i in range(1,len(self.vec)):if self.vec[i-1] >= self.vec[i]:return Falsereturn True

方法二 不使用数组

方法二:不额外申请数组占据空间的方法,遍历的过程中直接比较。
陷阱
陷阱1: 不能单纯的比较左节点小于中间节点,右节点大于中间节点就完事了;会出现下面的反面情况
在这里插入图片描述
陷阱2:
在这里插入图片描述
递归三部曲

  1. 定义全局变量记录遍历过程中的最大值,输入为root输出为bool
  2. 终止条件:如果为空节点,也是满足的。
  3. 单层遍历的逻辑:前序递归;一直更新maxVal,一旦发现maxVal >= root->val,就返回false,注意元素相同时候也要返回false;后续递归–>最后返回的应该是前序和后序遍历的结果

代码注意点:

  1. python里面设定极小值的代码为 self.maxVal = float(‘-inf’)
  2. 可以写>=的,,,,
  3. 单层中结合左右中的结果来返回。别忘了返回左右的判断结果
class Solution:def __init__(self):self.maxVal = float('-inf')  # 因为后台测试数据中有int最小值def isValidBST(self, root):if root is None:return Trueleft = self.isValidBST(root.left)# 中序遍历,验证遍历的元素是不是从小到大if self.maxVal < root.val:self.maxVal = root.valelse:return Falseright = self.isValidBST(root.right)return left and right

方法二 使用双指针优化

为了解决方法二中的担忧:如果输入的就是int的最小值怎么办,如何给maxvalue初始化呢?使用双指针法来优化
定义一个全局指针pre,单层的逻辑修改为if (pre != NULL && pre->val >= root->val) return false;pre = root; // 记录前一个节点

class Solution(object):def __init__(self):self.pre = None def isValidBST(self, root):""":type root: TreeNode:rtype: bool"""if not root: return Trueleft = self.isValidBST(root.left)if self.pre and self.pre.val >= root.val: return Falseself.pre = rootright =  self.isValidBST(root.right)return left  and right

方法三 递归法


总结

today还是太慢了。一直在玩,实验都没有怎么做。

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

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

相关文章

攻击者常用的五个数据中转网站

近来&#xff0c;各种数据中转网站被攻击者广泛用于传播代码片段、配置文件和各种文本数据&#xff0c;尽管这为研究人员提供了观察的窗口&#xff0c;但敏感信息被上传到互联网上时&#xff0c;也会对受害者构成巨大威胁。 这些网站通常并不需要注册或者身份验证&#xff0c;…

深入了解Linux中的环境变量

在Linux系统中&#xff0c;环境变量&#xff08;Environment Variables&#xff09;是用于配置操作系统和应用程序运行环境的一种机制。它们储存在键值对中&#xff0c;可以控制程序的行为、路径查找和系统配置。本文将深入探讨环境变量的基本概念、常见类型、设置和管理方法&a…

Latex公式编辑:在矩阵内画横线与竖线

在LaTeX中&#xff0c;要在矩阵内绘制横线和竖线&#xff0c;我们通常使用array或matrix环境&#xff0c;并结合\hline&#xff08;用于横线&#xff09;和|&#xff08;用于竖线&#xff09;来实现。但需要注意的是&#xff0c;\hline通常用于表格环境中。 LaTeX中绘制分块矩阵…

idea配置ssh、sftp连接服务器,docker插件使用,极其方便,无需再开第三方软件去操作服务器了,集成用于Idea一体

目录 配置SSH连接服务器 配置SFTP文件传输 Docker插件使用 配置SSH连接服务器 Setting>Tools>SSHConfigurations,点击加号新建一个连接&#xff0c;认证形式选key pair 打开终端&#xff0c;连接服务器&#xff0c;就可以终端操作服务器了 配置SFTP文件传输 文件浏览窗…

ThreadLocal简介

Thread类中&#xff0c;有个ThreadLocal.ThreadLocalMap 的成员变量。 ThreadLocalMap内部维护了Entry数组&#xff0c;每个Entry代表一个完整的对象&#xff0c;key是ThreadLocal本身&#xff0c;value是ThreadLocal的泛型对象值 public void set(T value) {Thread t Thread…

装机必备——WinRAR安装教程

装机必备——WinRAR安装教程 软件下载 软件名称&#xff1a;WinRAR 软件语言&#xff1a;简体中文 软件大小&#xff1a;3.38M 系统要求&#xff1a;Windows7或更高&#xff0c; 32/64位操作系统 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM4G或更高 下载通道①迅雷云盘丨下…

Linux线程:线程控制

目录 一、线程的退出与等待 1.1pthread_join线程等待 1.2线程异常 1.3线程如何退出和结束 ​编辑 二、线程切换 三、线程的优缺点 3.1优点 3.2缺点 3.3线程vs进程 四、多线程的使用及实操 4.1堆空间共享 一、线程的退出与等待 在Linux中线程具有如下的特点&#xf…

postman教程-4-发送post请求

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了postman发送get请求的方法&#xff0c;本小节我们讲解一下postman发送post请求的方法。 POST请求通常用于向服务器提交数据以创建新资源或执行某些操作。与GET请求不同&#xff0c;POST请求可…

景源畅信电商:做抖店的成本高吗?

在当今数字化时代&#xff0c;抖音不仅仅是一个分享短视频的平台&#xff0c;更是一个充满商机的市场。随着抖音用户量的激增&#xff0c;越来越多的商家和个人开始关注在抖音上开设店铺&#xff0c;即所谓的“抖店”。那么&#xff0c;做抖店的成本高吗?这个问题困扰着许多初…

【鱼眼镜头11】Kannala-Brandt模型和Scaramuzza多项式模型区别,哪个更好?

Kannala-Brandt模型和Scaramuzza多项式模型在描述鱼眼相机畸变时都有其特定的数学表示和应用&#xff0c;但它们之间存在一些区别。以下是对两者区别的分点表示和归纳&#xff1a; 数学表示&#xff1a; Kannala-Brandt模型&#xff1a;它假设图像光心到投影点的距离和角度的多…

Autodl如何进行实例使用(同区)

一、首先找到之前保存的实例 二、点击更多然后选择克隆实例 三、选择是否要保存之前的数据盘 四、选择空余的GPU进行创建即可

【Redis】持久化操作详解

Redis 持久化操作详解 Redis 实现持久化的时候&#xff0c;具体是按照什么样的策略来实现的呢&#xff1f; Redis支持两种方式的持久化&#xff0c;一种是RDB方式、另一种是AOF&#xff08;append-only-file&#xff09;方式&#xff0c;两种持久化方式可以单独使用其中一种&…

springcloud 之 Ribbon Hystrix Feign bus 动态修改配置

Ribbon 是微服务架构图中负责负载均衡的 组件。 BeanLoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}测试如下&#xff1a; //微服务方式 Ribbon方式GetMapping("ribbon/{name}")public String RibbonTest(PathVariable String nam…

大模型所谓的参数是什么?大模型为什么需要训练?大模型训练到底干了什么?

“ 大模型的本质是机器学习&#xff0c;机器学习的本质就是一种数学模型。” 我们经常能听到这样的说法&#xff0c;某某大模型有多少参数&#xff0c;某某大模型参数量又提升了&#xff0c;这里所说的参数到底是什么&#xff1f; 我们知道大模型是训练出来的&#xff0c;那么…

中小学校活动怎样投稿给媒体报道宣传?

身为一名学校老师,同时承担起单位活动向媒体投稿的宣传重任,我深知每一次校园活动背后的故事,都承载着师生们的辛勤汗水与教育的无限可能。起初,我满怀着对教育的热情,希望通过文字传递校园的温暖与光芒,却在投稿的道路上遇到了前所未有的挑战。 最初,我选择了最传统的路径——…

【RSGIS数据资源】中国多时期土地利用遥感监测数据集(CNLUCC)

文章目录 数据基本信息摘要数据说明数据引用方式 数据基本信息 数据时间&#xff1a; 多时期(1970年代末期以来11期) 空间位置&#xff1a; 中国 数据格式&#xff1a; 矢量与栅格 空间分辨率&#xff1a; 30m 主题分类&#xff1a; 中国土地利用遥感监测数据 DOI标识&#xf…

UNION的使用

UNION的使用 给出将多条查询语句组合成单个结果集&#xff0c;两个表对应的列数和数据类型必须相同 UNION操作符&#xff1a; 返回两个查询结果集的并集&#xff0c;并去除重复记录 UNION ALL操作符 返回两个查询的结果集的并集。不去掉两个结果集的重复部分&#xff0c;重…

存储方式 - 前端学习

1. cookie是什么&#xff1f;你了解cookie吗&#xff1f; 在计算机领域中&#xff0c;特指一种由服务器发送到用户浏览器并保存在用户计算机上的小型文本文件。这个文件可以被服务器用来识别用户身份、跟踪用户活动、保存用户设置等。它通常由名称、值、域名、路径、过期时间等…

【漏洞复现】号卡极团分销管理系统 ue_serve.php 任意文件上传漏洞

0x01 产品简介 号卡极团分销 管理系统&#xff0c;同步对接多平台&#xff0c;同步订单信息&#xff0c;支持敢探号一键上架&#xff0c;首页多套U|商品下单页多套模板&#xff0c;订单查询支持实时物流信息、支持代理商自定义域名、泛域名绑定&#xff0c;内置敢探号、172平台…

CLIP源码详解:clip.py 文件

前言 这是关于 CLIP 源码中的 clip.py 文件中的代码带注释版本。 clip.py 文件的作用&#xff1a;封装了 clip 项目的相关 API&#xff0c;通过这些 API &#xff0c;我们可以轻松使用 CLIP 项目预训练好的模型进行自己项目的应用。 另外不太容易懂的地方都使用了二级标题强…