代码随想录算法训练营第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。这点还是需要好好理解一下的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python的多线程

多线程 1. 程序&#xff0c;进程&#xff0c;线程 1、程序是指一组指示计算机或其他具有信息处理能力装置执行动作或做出判断的指令&#xff0c;通常用某种程序设计语言编写&#xff0c;运行于某种目标计算机体系结构上。程序的通俗定义就是&#xff1a;一段可执行的代码 2、进…

http 3.0 有哪些新特性

HTTP/3 是超文本传输协议&#xff08;HTTP&#xff09;的最新主要版本&#xff0c;其显著特点是放弃了传统的TCP作为传输层协议&#xff0c;转而采用基于UDP的QUIC&#xff08;Quick UDP Internet Connections&#xff09;协议。以下是HTTP/3利用QUIC实现高性能传输的关键特性&…

检索增强生成(RAG)技术

随着大型语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域的显著进步&#xff0c;它们在多个评估基准测试中显示出超越人类水平的语言和知识掌握能力。然而&#xff0c;这些模型在实际应用中也面临着一系列挑战&#xff0c;如制造事实、知识…

关于stm32cubemx时钟设置中css enable的作用

STM32已提供了一个时钟失常恢复机制(CSS)&#xff0c;当系统选择HSE作系工作时钟&#xff0c;并打开了CSS功能后&#xff0c;当HSE由于外部原因而停震时&#xff0c;系统将自动切换到内部HSI运行&#xff0c;并产生NMI中断&#xff0c;于是可以在NMI中断中进行安全处理。在cube…

Java中的BIO、NIO与AIO

1.概述 I/O 模型简单的理解&#xff1a;就是用什么样的通道进行数据的发送和接收&#xff0c;很大程度上决定了程序通信的性能。Java 共支持 3 种网络编程模型 I/O 模式&#xff1a;BIO、NIO、AIO。 2.Java BIO Java BIO(Blocking I/O)&#xff1a;是传统的java io 编程&#…

话题——为什么要学习程序,成为程序员呢?

选择成为一名程序员&#xff0c;这对我而言并非是一时冲动&#xff0c;而是深思熟虑后的坚定选择。在当下这个信息化、数字化的时代&#xff0c;程序员这一职业不仅具有极高的技术含量&#xff0c;更承载了推动社会进步、引领科技发展的重任。特别是在深度学习这一前沿领域&…

【六十四】【算法分析与设计】699. 掉落的方块,离散化操作,线段树优化,区间查询sum+区间更新update

699. 掉落的方块 在二维平面上的 x 轴上&#xff0c;放置着一些方块。 给你一个二维整数数组 positions &#xff0c;其中 positions[i] [left(i), sideLength(i)] 表示&#xff1a;第 i 个方块边长为 sideLength(i) &#xff0c;其左侧边与 x 轴上坐标点 left(i) 对齐。 每个…

Midjourney如何利用chaos控制生成图片的差异化

hello 小伙伴们&#xff0c;我是你们的老朋友——树下&#xff0c;今天分享Midjourney提示词常用参数——chaos&#xff0c;话不多说&#xff0c;直接开始~ chaos参数什么意思呢&#xff1f; 它可以用来控制我们生成图片之间的差异化程度的一个参数 通常我们在用Midjourney生…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-1.1

前言&#xff1a; 本文是来自哔哩哔哩网站上视频“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”的学习笔记&#xff0c;在这里会记录下正点原子Linux ARM MX6ULL 开发板根据配套的哔哩哔哩学习视频所作的实验和笔记内容。本文大量的引用了正点原子哔哔哩网…

服务器 BMC(基板管理控制器,Baseboard Management Controller)认知

写在前面 工作中遇到&#xff0c;简单整理博文内容涉及 BMC 基本认知理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候&#xff0c;眼前的风景已经和从前不一样了。——村上春树 基板管理控制器&#xff08;BMC&…

小米一面:说说MVC与设计模式的关系

前言 大家好&#xff0c;我叫阿杆&#xff0c;不叫阿轩。 先来看看面试环节吧。 面试官&#xff1a;请说说MVC模式是基于哪种设计模式的&#xff1f; 求职者&#xff1a;MVC本身不就是一种设计模式吗&#xff1f; 面试官&#xff1a;我的意思是&#xff0c;MVC是基于23中设计…

SD-WAN为什么在亚太地区普及?

当前&#xff0c;软件定义广域网SD-WAN在亚太地区具有稳固的地位。它看起来是技术与地形的完美结合&#xff0c;因为亚太地区拥有许多大国&#xff0c;其中一些国度辽阔&#xff0c;人口分布在广阔的地理区域和偏远地区&#xff0c;如印度&#xff0c;澳大利亚&#xff0c;越南…

Introducing Meta Llama 3: The most capable openly available LLM to date

要点 今天&#xff0c;我们推出 Meta Llama 3&#xff0c;这是我们最先进的开源大型语言模型的下一代。Llama 3型号将很快在AWS&#xff0c;Databricks&#xff0c;Google Cloud&#xff0c;Hugging Face&#xff0c;Kaggle&#xff0c;IBM WatsonX&#xff0c;Microsoft Azur…

代码随想录算法训练营第四十六天| LeetCode139.单词拆分

一、LeetCode139.单词拆分 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88%86.html 状态&#xff1a;已解决 1.思路 单词明显就是物品&#xff0c;字符串s明显就是背包&#xff0c;那么问题就变成了物品能不能把背…

Three 银河系

总体效果图 当然&#xff0c;这也只是银河系的一部分&#xff0c;要想知道全景视野下的银河系是什么样的&#xff0c;只有通过科学家依据观测结果所制作的绘图来实现&#xff0c;因为银河系实在是太大了&#xff0c;目前的技术水平还无法实现全景捕捉。绘制的这张三维立体图像…

记录:阿里云服务器网站搭建(4)

Docker安装Nginx 现阶段主要目的是做一些静态资源路径的转发代理&#xff0c;相当于一个web服务器&#xff0c;tomcat也可以设置凡访问静态资源。但考虑到后续还需要作为代理服务器对域名等进行代理转发&#xff0c;所以使用nginx。 准备好要挂载的nginx配置目录 mkdir -p /m…

React-RTK

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容:React-RTK 目录 1、介绍 2、安装 3、编写RTK使用示例 4、官方提供项目包示例 创建 Redux …

ROS 2边学边练(33)-- 写一个静态广播(C++)

前言 通过这一篇我们将了解并学习到如何广播静态坐标变换到tf2&#xff08;由tf2来转换这些坐标系&#xff09;。 发布静态变换对于定义机器人底座与其传感器或非移动部件之间的关系非常有用。例如&#xff0c;在以激光扫描仪中心的坐标系中推理激光扫描测量数据是最简单的。 这…

基于人工智能的机动车号牌检测与推理系统v1.0

基于人工智能的机动车号牌检测与推理系统v1.0代码重构与实现。 目前整合3中现有算法&#xff0c;并完成阶段性改造&#xff0c;包括【传统方法检测车牌&#xff0c;SVM推理字符】、【YOLO方法检测车牌&#xff0c;SVM推理字符】、【YOLO方法检测车牌&#xff0c;CNN推理字符】&…

MapReduce案例-电影网站数据统计分析

本文适合大数据初学者学习MapReduce统计分析业务问题的步骤和基础的MapReduce编程方法&#xff0c;初步掌握Hadoop对计算任务的管理。 本文末尾有全部数据集和完整代码连接。 1.准备工作 安装Hadoop:Hadoop 3.3.2 离线安装-CSDN博客 按照好Hadoop之后要检查一下datanode运行情况…