代码随想录Day20:二叉树Part6

Leetcode 654. 最大二叉树

讲解前:

这道题其实思路并不难,无非就是找到当前数组的最大值作为root节点,然后对数组进行切割之后再对左右两个数组进行递归重复操作

class Solution:def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:# base case when lenght is one create the leaf nodeif len(nums) == 1:return TreeNode(nums[0], None, None)# search the current list and find max num and its indexindex = 0max_val = 0for i, n in enumerate(nums):if n > max_val:max_val = nindex = i# create the new node and have its left and right point# to the recursive callnode = TreeNode(max_val)# for left part, make sure we have element leftif index > 0:left = self.constructMaximumBinaryTree(nums[0: index])node.left = left# for right make sure index is not at endif index < len(nums) - 1:right = self.constructMaximumBinaryTree(nums[index + 1: len(nums)])node.right = rightreturn node
讲解后:

讲解后我打算试一下不用新建数组的方法,也就是重新写一个递归函数然后参数中传入的不仅是数组同时也有当前sublist的左右index,这样在进行分割操作的时候就只需要修改左右指针了,不需要传入一个新的数组

class Solution:def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:def dfs(nums, start, end):# base case when current range only has one elementif start == end:return TreeNode(nums[start])# find the max value in current rangeindex = 0max_val = 0for i in range(start, end + 1):if nums[i] > max_val:index = i max_val = nums[i]node = TreeNode(max_val)# do the split by modifying the start and endif index > start:left = dfs(nums, start, index - 1)node.left = leftif index < end:right = dfs(nums, index + 1, end)node.right = right return nodereturn dfs(nums, 0, len(nums) - 1)

这里我的start和end两个指针一直指向当前遍历的数组部分,并且使用的是左闭右闭的思路,所以在遍历每一个数字找到最大值的时候,range的右边要取到end + 1 


Leetcode 617. 合并二叉树

讲解前:

很烦,这道题尝试自己写写了半天没办法写好,处理不好递归的call该怎么弄

讲解后:

我不能理解为什么我一开始没有这样写,我感觉我一开始写的时候的版本其实和这个最像的,但是由于某些因素影响出了问题,在那之后我就和正确答案越走越远了

class Solution:def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:# base case if not root1 and not root2:return if root1 and not root2:return root1if root2 and not root1:return root2node = TreeNode(root1.val + root2.val)node.left = self.mergeTrees(root1.left, root2.left)node.right = self.mergeTrees(root1.right, root2.right)return node

Leetcode 700. 二叉搜索树搜索

讲解前:

我真的好烦,不知道为什么还是没办法把这么简答你的题写出来,总是掌握不好该返回的值,有很多问题,很沮丧,我每次不会的就是不知道如何才能在遍历到一半发现答案之后就停止遍历然后把答案一层一层的传上去

好吧我脑子出问题了,问题在于我的if 条件一开始就写错了,明明应该判断val的值是否大于小于当前节点值,我弄反了

class Solution:def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:# base case# when we reached the end still not found or # the current node is found if not root or root.val == val:return root# recursive caseif val < root.val:root = self.searchBST(root.left, val)else:root = self.searchBST(root.right, val)return root 

然后迭代法也非常好写,就直接一个while循环去找就行了,如果到最后遇到了none的情况就是没找到,如果中途找到了就直接return

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

思路和卡哥完全一样没问题

Leetcode 98. 验证二叉搜索树

讲解前:

这道题我之前是做过的,会比较容易踩的坑就是我们在遍历到每一个root的时候只去在乎当前的left和right是否遵循比root小和大,但是忽略了其实整个左右子树中所有的node都需要小于和大于root节点,所以我们需要一个区间,来通过遍历是进行更新,然后用他来限制所有的节点,所以我的解法中的left和right就是区间的大小,当我们遍历到当前节点之后,我们向左和向右遍历的时候,向左就可以更新右边的界限,把右边设置为当前节点的值,代表包括左节点在内的左子树中的所有节点值都应该只比当前节点小,右节点同理

class Solution:def isValidBST(self, root: Optional[TreeNode]) -> bool:# create a dfs check each node def dfs(root, left, right):# base case:if not root:return True if root.val <= left or root.val >= right:return False# update the left and right bound for left node# and right nodeleft = dfs(root.left, left, root.val)right = dfs(root.right, root.val, right)return left and rightreturn dfs(root, float('-inf'), float('inf')) 

讲解后:

卡哥视频中的思路和我上面的完全不一样,他主要是利用了BST的一个特性来解决的问题,那就是如果我们对一个BST进行中序遍历,那么遍历的顺序加入到一个list里,这个list一定是递增的顺序,所以这里的思路就是简单的对这个树进行中序遍历,过程中利用一个指针来指向上一个node,然后我们需要确认当前遍历的node的val永远比上一个node的val大,如果错了就直接返回False

class Solution:def isValidBST(self, root: Optional[TreeNode]) -> bool:pre = TreeNode(float('-inf'))def dfs(root):nonlocal preif not root:return Trueleft = dfs(root.left)if root.val > pre.val:pre = rootelse:return False right = dfs(root.right)return left and right return dfs(root)

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

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

相关文章

C语言获取输出相关函数scanf、gets、fgets等

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 二、 2.1 fgets 2024年3月26日19:31:46 今天写了个牛客的题目&#xff0c;坐标移动 坐标移动代码链接 里面我用gets&#xff0c;但是提示warni…

【统计】什么事 R 方

将线性模型拟合到时间序列时&#xff0c;通常使用最小二乘法在模型 y ^ ( t ) a b t \hat{y}(t) a bt y^​(t)abt中找到系数 a a a和 b b b&#xff0c;其中 y ^ ( t ) \hat{y}(t) y^​(t)是时间 t t t的预测值&#xff0c;而的观测值是 y ( t ) y(t) y(t)。 残差平方和又…

LeetCode第二天(628. 三个数的最大乘积)

给你一个整型数组 nums &#xff0c;在数组中找出由三个数组成的最大乘积&#xff0c;并输出这个乘积。 我的答案&#xff1a;&#xff08;只通过了63个用例&#xff0c;没考虑到两个负数相乘得正的情况&#xff09; class Solution {public int maximumProduct(int[] nums) …

ResultMap 映射

过在 MyBatis 的映射文件中使用 <result> 标签进行映射后&#xff0c;SQL 查询语句就可以使用 Java 实体类中的属性名来编写。当你在 ResultMap 中使用 <result> 标签将数据库表的字段名和 Java 实体类的属性名进行映射后&#xff0c;MyBatis 在执行 SQL 查询时会自…

【自我提升】计算机领域相关证书

目录 计算机技术与软件专业资格&#xff08;水平&#xff09;考试证书&#xff08;软考&#xff09;Oracle认证Cisco认证微软认证红帽认证AWS认证 计算机技术与软件专业资格&#xff08;水平&#xff09;考试证书&#xff08;软考&#xff09; 计算机技术与软件专业技术资格&a…

掌握Yarn:一步步安装、配置及应用全解析!

深入理解Yarn&#xff1a;安装、配置与实战应用 引言一、 Yarn简介二、 Yarn的安装三、 Yarn的基本使用四、 Yarn的高级功能五、 Yarn与持续集成/持续部署&#xff08;CI/CD&#xff09;六、 Yarn的定制化与扩展七、 社区和生态系统 引言 大家好&#xff0c;这里是程序猿代码之…

【数仓】DataX软件安装及配置,从mysql同步到hdfs

相关文章 【数仓】基本概念、知识普及、核心技术【数仓】数据分层概念以及相关逻辑【数仓】Hadoop软件安装及使用&#xff08;集群配置&#xff09;【数仓】Hadoop集群配置常用参数说明【数仓】zookeeper软件安装及集群配置【数仓】kafka软件安装及集群配置【数仓】flume软件安…

C++中的内存分区

栈&#xff1a;在执行函数时&#xff0c;函数内局部变量的存储单元都可以在栈上创建&#xff0c;函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中&#xff0c;效率很高&#xff0c;但是分配的内存容量有限 堆&#xff1a;就是那些由 new分配的内…

Prometheus(六):Blackbox监控安装配置

目录 1 Blackbox Exporter安装配置1.1 Blackbox Exporter简介1.2 安装1、安装-使用源码包安装下载安装blackbox.yml文件配置快速启动文件 2、安装-使用docker 1.3 Prometheus配置1、http监控2、ping探测-ip3、https probe-DNS解析4、metrics配置5、TCP监控-探测端口 总结 1 Bla…

2022全球AI生物智药大赛赛道二参赛攻略@paipai

大家好&#xff0c;我是来自paipai队的徐一帆&#xff0c;Github ID IvanaXu [01]&#xff0c;相关研究工作都会开源在上面&#xff0c;欢迎大家关注&#xff01; 以下是关于本次“云上进化”2022全球AI生物智药大赛 [02]&#xff1a;赛道二“抗原抗体结合Epitope和Paratope精…

8.2024

我们知道第一个质数是2&#xff0c;第二个质数是3&#xff0c;第三个质数是5.... 请你计算第2023个质数? 代码&#xff1a; import java.util.ArrayList;public class 第八题 {public static void main(String[] args) {ArrayList<Object> list new ArrayList<>…

鸿蒙OS实战:【module的使用】

在开发HarmonyOS应用时&#xff0c;默认创建的工程会有一个entry module&#xff0c;实际应用场景为了代码或者功能解耦&#xff0c;我们需要用到module来进行隔离。根据鸿蒙3.0/3.1/4.0官方指导&#xff0c;我们可以了解到关于module的类型&#xff0c;以及依赖关系&#xff0…

代码随想录学习Day 18

530.二叉搜索树的最小绝对差 题目链接 讲解链接 思路&#xff1a;利用二叉搜索树的性质&#xff0c;其中序遍历序列是一个有序数组。所以先对二叉搜索树进行中序遍历&#xff0c;得到一个递增的数组后&#xff0c;再遍历整个数组&#xff0c;依次求相邻值的差&#xff0c;最…

漏洞扫描-让安全弱点无所遁形

随着信息技术的迅猛发展和互联网的广泛普及&#xff0c;网络安全问题日益凸显。在这个数字化的世界里&#xff0c;无论是企业还是个人&#xff0c;都面临着前所未有的安全威胁。安全漏洞&#xff0c;作为这些威胁的源头&#xff0c;常常被忽视或无法及时发现。 而漏洞扫描&…

静态住宅IP优缺点,究竟要怎么选?

在进行海外 IP 代理时&#xff0c;了解动态住宅 IP 和静态住宅 IP 的区别以及如何选择合适的类型非常重要。本文将介绍精态住宅 IP 特点和&#xff0c;并提供选择建议&#xff0c;帮助您根据需求做出明智的决策。 静态住宅 IP 的特点 静态住宅 IP 是指 IP 地址在一段时间内保…

C++11 手写线程池

#include<bits/stdc.h> #include<thread> #include<mutex> #include<condition_variable> #include<functional> //https://www.bilibili.com/video/BV1d841117SH?p9&vd_source4943da2c9c0dacb95119f2042d2dfacc /*** 线程池&#xff1a;预…

echarts图表自适应和其他问题

1.使用 eCharts 提供的 resize()方法&#xff0c;监听图表容器的大小并改变图表大小 // 监听 resize 事件 window.addEventListener("resize", function () {this.chart.resize(); }); 报错如下&#xff1a;Uncaught TypeError: Cannot read properties of undefine…

经验篇04-为什么学了很多知识/读了很多书却没用

前言 以下内容是参加古典老师的写作训练营&#xff0c;古典老师分享的视频课程&#xff0c;对于喜欢阅读或者学习的人来说&#xff0c;可以揭开【学了很多东西却没用】这个问题的神秘面纱&#xff0c;我个人收获非常大&#xff0c;结合了一些自己的理解&#xff0c;形成此文&am…

数据链路层(四):数据链路层协议

目录 1 数据链路层协议1.1 异步协议1.2 同步协议1.3 局域网数据链路层协议1.4 广域网数据链路层协议 1 数据链路层协议 数据链路层“协议”也称为“规程”&#xff0c;数据链路控制协议也称数据链路控制规程。 数据链路控制协议主要分为异步协议和同步协议两大类。 1.1 异步协…

java常用IO流功能——字符流和缓冲流概述

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup! 之前说了下了IO流的概念&#xff0c;并整理了字节流&#xff0c;有需要的可以看这篇 java常用应用程序编程接口&#xff08;API&#xff09;——IO流概述及字节流的使用 字符流 FileReader(文件字…