代码随想录算法训练营第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

相关文章

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引