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

本文主要是介绍代码随想录算法训练营第20天 |654.最大二叉树、 617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

  • 自己看到题目的第一想法
  • 看完代码随想录之后的想法
  • 自己实现过程中遇到哪些困难

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

自己看到题目的第一想法

654.最大二叉树:明确了是递归法,知道应该使用三部曲,首先确定递归函数的参数和返回类型,构建二叉树返回类型是void,参数为数组;终止条件应该是数组使用完成;递归函数内的逻辑是前序遍历。
700.二叉搜索树中的搜索:递归,前序遍历

看完代码随想录之后的想法

654.最大二叉树:首先整体思路是递归,三部曲,递归函数输入参数是数组,返回值应当是根节点,而不是空,这点我自己第一想法是错误的,终止条件应该是数组的长度为1,因为数组长度为1说明此时已经是在叶子节点了,递归函数内部逻辑是前序遍历,先根据输入数组的最大值构造根节点,因为是数组,根据数组的特点可以根据最大值索引下标划分成左右子数组从而分别对左子树和右子树进行构造。另外可以回顾一下昨天的题目。

class Solution {public TreeNode constructMaximumBinaryTree(int[] nums) {return Construct(nums,0,nums.length-1);}public TreeNode Construct(int[] nums,int leftIndex,int rightIndex){if(leftIndex>rightIndex){return null;}//求数组的最大值索引下标int maxIndex =leftIndex;for(int i=leftIndex+1;i<=rightIndex;i++){if(nums[maxIndex]<nums[i]){maxIndex=i;}}//构建中间节点TreeNode root = new TreeNode(nums[maxIndex]);//左root.left = Construct(nums,leftIndex,maxIndex-1);root.right=Construct(nums,maxIndex+1,rightIndex);return root;}
}

617.合并二叉树:同时处理两个二叉树,在一个二叉树上操作,前序遍历。
700.二叉搜索树中的搜索:自己忽略了二叉搜索树是个有序树。
98.验证二叉搜索树:自己写代码碰到了陷阱,题目要求的是所有左子树的节点而不是只比较该节点的左节点。
自己错误的写法增加了判断左右节点不为空的情况之后还是会无法通过全部测试样例:
这样写会因为下面的情况而错误
在这里插入图片描述这道题有思路是简单的,但是难点在于能否写出通过全部样例的代码。通常写的代码是递归每一个节点的左右子树的大小关系,而并不能表明左右子树的所有都是满足大小关系的。看了题解之后觉得,利用一步步更新的边界值来限定节点会规范这个问题。
这道题和700题有思想相近的地方,都是通过更新限定来递归。

自己实现过程中遇到哪些困难

654.最大二叉树:这道题有两种想法,第一种是更耗时耗空间的方法,也就是我上面写的看完随想录之后的想法,它耗时的原因是每次递归都重新创建数组,这个数组是根据找到最大值的索引下标后从原数组更新得来的,而每次的创建过程都会对时间和空间进行消耗。我在看了答案之后发现,每次可以在原数组上操作,递归函数输入参数为原数组nums和要构建子树的数组的左索引下标和右索引下标。自己写代码的过程中发现自己并不会更新索引下标,困在了左右子树不同索引下标的疑惑中,没有想清楚。问了同学之后明白了在每次递归函数的处理逻辑中,前序遍历的左子树和右子树的边界是变化的,左边是leftIndex到maxIndex-1,右边是maxIndex+1到rightIndex。这点还是需要好好理解一下的。

这篇关于代码随想录算法训练营第20天 |654.最大二叉树、 617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/930942

相关文章

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

轻松掌握python的dataclass让你的代码更简洁优雅

《轻松掌握python的dataclass让你的代码更简洁优雅》本文总结了几个我在使用Python的dataclass时常用的技巧,dataclass装饰器可以帮助我们简化数据类的定义过程,包括设置默... 目录1. 传统的类定义方式2. dataclass装饰器定义类2.1. 默认值2.2. 隐藏敏感信息

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制