代码随想录算法训练营第十七天

目录

LeetCode.654 最大二叉树

题目链接 最大二叉树

题解

解题思路

LeetCode.617 合并二叉树

题目链接  合并二叉树

题解

解题思路

LeetCode.700 二叉搜索树中的搜索

题目链接 二叉搜索树中的搜索

题解

解题思路

解题思路

LeetCode.98 验证二叉搜索树

题目链接 验证二叉搜索树

题解

解题思路

解题思路

总结与收获


LeetCode.654 最大二叉树

题目链接 最大二叉树

题解

class Solution {public TreeNode constructMaximumBinaryTree(int[] nums) {return getRoot(nums,0,nums.length);}public TreeNode getRoot(int[] nums,int begin,int end){// 获得最大值int max_value = nums[begin];int index = begin;for(int i = index;i < end;i ++){if(max_value < nums[i]){index = i;max_value = nums[i];}}TreeNode root = new TreeNode(max_value);if(index > begin){root.left = getRoot(nums,begin,index);}if(index < end - 1){root.right = getRoot(nums,index + 1,end);}return root;}
}

解题思路

这段代码实现了构造最大二叉树(Maximum Binary Tree)的功能,核心思路是递归分治:每次从当前数组片段中找到最大值作为根节点,再递归处理左右子数组构建左右子树。具体步骤如下:

  1. 主函数入口constructMaximumBinaryTree 初始化递归,传入整个数组范围 [0, nums.length)

  2. 递归构建树:辅助函数 getRoot 负责:

    • 寻找最大值:遍历当前范围 [begin, end),找到最大值及其索引。
    • 创建根节点:用最大值创建当前子树的根。
    • 递归处理左右子树
      • 左子树:处理范围 [begin, index)(即最大值左侧元素)。
      • 右子树:处理范围 [index+1, end)(即最大值右侧元素)。
    • 返回当前根节点:将左右子树连接到根节点后返回。
  3. 递归终止条件:当 begin >= end 时(即处理空数组片段),返回 null

LeetCode.617 合并二叉树

题目链接  合并二叉树

题解

class Solution {public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {if(root1 == null) return root2;if(root2 == null) return root1;root1.val += root2.val;root1.left = mergeTrees(root1.left,root2.left);root1.right = mergeTrees(root1.right,root2.right);return root1;}
}

解题思路

使用前序遍历,同时对两个树进行遍历。

LeetCode.700 二叉搜索树中的搜索

题目链接 二叉搜索树中的搜索

题解

class Solution {public TreeNode searchBST(TreeNode root, int val) {if(root == null) return null;if(root.val == val) return root;TreeNode resNode = null;if(val < root.val) resNode = searchBST(root.left,val);if(val > root.val) resNode = searchBST(root.right,val);return resNode;}
}

解题思路

这段代码实现了在  二叉搜索树(BST) 中查找值为 val 的节点。解题思路基于 BST 的特性:左子树所有节点值小于根节点,右子树所有节点值大于根节点,因此可以通过比较当前节点值与目标值的大小,递归地缩小搜索范围。

解题思路

  1. BST 特性利用

    • 若当前节点值等于 val,直接返回当前节点。
    • 若 val 小于当前节点值,只需在左子树中继续搜索(因为右子树所有值都更大)。
    • 若 val 大于当前节点值,只需在右子树中继续搜索(因为左子树所有值都更小)。
  2. 递归搜索过程

    • 终止条件:当前节点为空(未找到)或当前节点值等于 val(找到目标)。
    • 递归逻辑:根据当前节点值与 val 的大小关系,选择左子树或右子树继续搜索,并返回搜索结果。
  3. 代码实现步骤

    • 检查当前节点:若为空或值匹配,直接返回。
    • 递归搜索
      • 若 val < root.val,递归搜索左子树。
      • 若 val > root.val,递归搜索右子树。
    • 返回结果:递归调用的结果即为最终结果。

LeetCode.98 验证二叉搜索树

题目链接 验证二叉搜索树

题解

class Solution {private long prev = Long.MIN_VALUE;public boolean isValidBST(TreeNode root) {if(root == null) return true;if(!isValidBST(root.left)) return false;if(root.val <= prev) return false;prev = root.val;return isValidBST(root.right);}
}

解题思路

这段代码通过中序遍历(In-order Traversal)的方式验证二叉树是否为合法的二叉搜索树(BST)。解题的核心思路是利用 BST 的中序遍历结果为严格升序序列这一特性,通过递归遍历过程中检查每个节点的值是否严格大于前一个访问的节点值。

解题思路

  1. BST 的中序遍历特性

    • 对于合法的 BST,中序遍历(左 → 根 → 右)的输出必须是严格递增的序列。
    • 例如,BST [2,1,3] 的中序遍历为 [1,2,3],严格递增。
  2. 递归中序遍历验证

    • 使用全局变量 prev 记录中序遍历过程中前一个节点的值(初始化为 Long.MIN_VALUE)。
    • 递归遍历左子树,若左子树不合法则直接返回 false
    • 检查当前节点值是否大于 prev,若不大于则返回 false
    • 更新 prev 为当前节点值,递归遍历右子树。
  3. 代码实现步骤

    • 终止条件:空树视为合法 BST,返回 true
    • 递归左子树:验证左子树是否合法。
    • 检查当前节点:确保当前节点值大于 prev,并更新 prev
    • 递归右子树:验证右子树是否合法。

总结与收获

总结上述二叉树相关题目解法,核心均围绕递归与树的特性展开。构造最大二叉树用递归分治,以最大值为根划分左右子树;合并二叉树通过前序遍历同步处理两树节点;BST 搜索和验证则依托其左小右大特性,分别用递归缩小范围和中序遍历检查升序。这些解法体现了递归在树问题中的高效应用,以及利用数据结构特性简化逻辑的关键思路。

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

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

相关文章

pycharm无法识别pip安装的包

在使用conda创建一个新的环境后&#xff0c;有些包通过pip的方式安装更方便有效&#xff0c;若在pip安装后&#xff0c;遇到该环境没有此包&#xff0c;或pycharm监测不到此包&#xff0c;通常是pip的环境指向有问题。 解决措施&#xff1a; # 首先检查当前pip的指向 which pip…

Elasticsearch 的 `modules` 目录

Elasticsearch 的 modules 目录是存放**核心功能模块**的目录&#xff0c;这些模块是 Elasticsearch 运行所必需的基础组件&#xff0c;**随官方发行版一起提供**&#xff0c;但设计上允许通过移除或替换模块来**定制化部署**&#xff08;比如构建一个最小化的 Elasticsearch 实…

https——TCP+TLS

https——TCPTLS主题&#xff1a;基于mbedtls-2.16.0&#xff0c;验证TLS会话复用功能验证环境&#xff1a;1.TLS服务端2.TLS客户端2.1 基于Sesssion ID2.1.1mbedtls-2.16.0库的宏配置2.1.2 初始化配置2.1.3 TCP连接2.1.4 首次TLS连接2.1.4.1 发送加密算法列表2.1.4.2 选择加密…

uni-app uni-push 2.0推送图标不展示问题

问题现象&#xff1a;我在uni-app的配置文件&#xff0c;配置了推送的大图标小图标发现在真机测试无法展示配置的推送图标问题 官网文档&#xff1a;开通 | uni-app官网 解决方法&#xff1a; 在uni-app官网中说的并不是很清楚只给了一个简单的示例&#xff0c;配置并没有告诉我…

scp:上传大型数据集到实验室服务器

我通过百度网盘下载了大概200GB的LUNA-2016的肺结节CT数据。实验是在实验室服务器上进行的&#xff0c;我现在需要将本地的数据集传输到实验室的服务器上。我已经通过remote-ssh连接上了实验室的服务器&#xff0c;但是如果通过这个插件上传数据的话&#xff0c;一方面不支持上…

量子计算突破:8比特扩散模型实现指数级加速

目录 一、量子扩散模型&#xff08;Quantum Diffusion&#xff09; 二、DNA存储生成&#xff08;Biological-GAN&#xff09; 三、光子计算加速 四、神经形态生成 五、引力场渲染 六、分子级生成 七、星际生成网络 八、元生成系统 极限挑战方向 一、量子扩散模型&…

Flask3.1打造极简CMS系统

基于Flask 3.1和Python 3.13的简易CMS以下是一个基于Flask 3.1和Python 3.13的简易CMS管理系统实现方案&#xff0c;包含核心功能和可运行代码示例。环境准备安装Flask和其他依赖库&#xff1a;pip install flask3.1.0 flask-sqlalchemy flask-login配置数据库在config.py中设置…

用 Node.js 构建模块化的 CLI 脚手架工具,从 GitHub 下载远程模板

本文将手把手带你构建一个支持远程模板下载、自定义项目名称&#xff0c;并完成模块化拆分的 CLI 脚手架工具&#xff0c;适用于初创项目、团队内部工具或者开源项目快速初始化。&#x1f9e9; 为什么要自己造一个 CLI 脚手架&#xff1f; 在日常开发中&#xff0c;我们常用脚手…

08.如何正确关闭文件

如何正确关闭文件(File Handling Best Practices) 文件操作是日常开发中非常常见的任务,正确关闭文件对于避免资源泄漏尤为关键。错误的文件关闭方式可能导致文件未保存、锁定或其他异常。 1. 常见的错误方式:手动 close() 许多初学者会手动调用 close() 关闭文件,这在异…

算法入门--动态规划(C++)

深入浅出掌握动态规划核心思想&#xff0c;图文并茂实战代码 什么是动态规划&#xff1f; 动态规划&#xff08;Dynamic Programming, DP&#xff09; 是一种高效解决多阶段决策问题的方法。它通过将复杂问题分解为重叠子问题&#xff0c;并存储子问题的解&#xff08;避免重…

[2025CVPR]GNN-ViTCap:用于病理图像分类与描述模型

论文结构解析​ 本文采用经典学术论文结构: ​引言​:阐述病理图像分析的挑战与现有方法局限性​相关工作​:系统梳理MIL、视觉语言预训练和生物医学语言模型三大领域​方法​:详细阐述GNN-ViTCap四阶段架构​实验​:在BreakHis和PatchGastric数据集验证性能​讨论​:通…

Java SE--图书管理系统模拟实现

一.设计思路首先这个系统可以由俩种用户使用&#xff0c;分别为管理者用户和普通者用户&#xff0c;根据不同的用户有不同的界面&#xff0c;每个界面有不同的功能。二.代码实现创建三个包和一个类book包&#xff1a;包括Book类和Booklist类Book类&#xff1a;package book; pu…

[RPA] 批量数据抓取指定商品名称信息

影刀RPA案例&#xff1a;批量数据抓取指定商品名称信息流程图&#xff1a;操作步骤&#xff1a;涉及的影刀RPA大致指令&#xff1a; 1. 打开影刀商城页面 2. 使用【填写输入框(web)】指令输入用户名和密码&#xff0c;并点击"登录"按钮 3. 切换到"订单管理"…

我的世界Java版1.21.4的Fabric模组开发教程(十四)方块实体

这是适用于Minecraft Java版1.21.4的Fabric模组开发系列教程专栏第十四章——方块实体。想要阅读其他内容&#xff0c;请查看或订阅上面的专栏。 方块实体(Block Entity) 指的是一种用于存储方块额外数据的方法。但这种数据和为了控制方块状态而在自定义方块类中创建的属性不太…

【UE教程/进阶】UE中的指针与引用

目录直接属性引用共享指针 TSharedPtr实现原理共享引用 TSharedRef弱引用指针 TWeakPtrObject弱指针 FWeakPtr实现原理Object软指针 FSoftObjectPtr原理直接属性引用 在c通过UPROPERTY()宏将属性公开&#xff0c;蓝图中属性类型中的Object Reference。 对一个类型及其子类型的…

早期 CNN 的经典模型—卷积神经网络(LeNet)

目录 LeNet 的设计背景与目标 LeNet 的网络结构&#xff08;经典 LeNet-5&#xff09; 局部感受野详解 一、局部感受野和全连接网络的区别 1. 传统全连接网络的问题 2. 局部感受野的解决方案 二、局部感受野的优势 1. 参数大幅减少 2. 提取局部特征 3. 平移不变性 参数…

RabbitMQ 高级特性之延迟队列

1. 简介 在某些场景下&#xff0c;当生产者发送消息后&#xff0c;可能不需要让消费者立即接收到&#xff0c;而是让消息延迟一段时间后再发送给消费者。 2. 实现方式 2.1 TTL 死信队列 给消息设置过期时间后&#xff0c;若消息在这段时间内没有被消费&#xff0c;就会将消…

uniapp app安卓下载文件 图片 doc xls 数据流文件 app安卓本地路径下载保存

//下载图片 downloadToLocal() {plus.android.requestPermissions([android.permission.WRITE_EXTERNAL_STORAGE],(success) > {uni.saveImageToPhotosAlbum({filePath: /static/x.png,//本地地址success: () > {this.$refs.uToast.show({message: "模版下载成功&am…

Context Engineering:从Prompt Engineering到上下文工程的演进

最近在做Deepresearch以及刷到一个不错的文章&#xff1a;context-engineering-guide &#xff0c;这篇文章揭示了提示工程以及上下文过程在智能体应用开源流程中&#xff0c;包括Deepresearch&#xff0c;MCP在内的一些概念&#xff0c;起到了非常重要的作用&#xff01; Cont…

jenkins部署vue前端项目

文章目录前言一、安装nginx二、jenkins构建项目总结前言 前面已经使用jenkins部署了后端springboot项目&#xff0c;现在开始学习jenkins部署前端Vue项目。 一、安装nginx 访问nginx官网&#xff0c;https://nginx.org/en/download.html下载tar包 上传到服务器目录中 然后到…