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

LeetCode 654 最大二叉树

在这里插入图片描述

本题思路:我们可以看到每次其实这个找最大值,然后创建节点的过程就是一个二叉树的前序遍历的过程。所以,我们可以递归来完成它。

  • 先创找到数组中,最大的值的下标,然后创建根节点
  • 然后根据下标,将数组分为,左数组,和右数组
  • 然后让根节点的左孩子等于 左数组中的最大值
  • 然后让根节点的右孩子等于 右数组中的最大值
  • 每一次递归之前,都要重新划分左数组和右数组!

注意:分割数组的时候,要注意区间。左闭右开(自己定义)

为了方便对代码的思路有个好的理解。举个例子演示下:
在这里插入图片描述

  • 首先在 nums 中找到 最大值 3 ,此时下标为 index = 0,创建根节点在这里插入图片描述
  • 然后分割左数组,右数组在这里插入图片描述
  • 再递归进入左数组,进行构造,发现,start 和 end 一样,所以返回 null ,让第一层递归 root.left 接收在这里插入图片描述
  • 再递归进入右数组,找到最大值,并创建节点,由于,start != end,所以会创建,让 root.right 接收在这里插入图片描述
  • 此时还要进行分割数组,分为左数组和右数组在这里插入图片描述
  • 然后节点 2 的递归的时候,进入左数组判断返回 null,进入右数组符合条件创建节点。然后给 节点 2 的 right在这里插入图片描述
class Solution {public TreeNode constructMaximumBinaryTree(int[] nums) {return tavel(nums,0,nums.length);}public TreeNode tavel(int[] nums,int start,int end){if(start == end){return null;}int index = findMaxIndex(nums,start,end);int rootValue = nums[index];TreeNode root = new TreeNode(rootValue);if(nums.length == 1){return root;}int leftstart = start;int leftend = index;int rigthstart = index+1;int rightend = end;root.left = tavel(nums,leftstart,leftend);root.right = tavel(nums,rigthstart,rightend);return root;}public static int findMaxIndex(int[] nums,int start, int end){int max = nums[start];int index = start;for(int i = start + 1; i < end; i++){if(nums[i] > max){max = nums[i];index = i;}}return index;}}

LeetCode 617 合并二叉树

在这里插入图片描述
本题思路:利用递归来完成。根据题目的描述,可以得到以下内容。我们用前序遍历来完成

  • 如果 root1 和 root2 都为空的情况下,直接返回即可
  • 如果 root1 == null,则返回 root2
  • 如果 root2 == null,则返回 root1
  • 两个不为null,创建节点,val = root1.val + root2.val
  • 然后再一次递归,进入左子树,进入右子树
class Solution {public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {// 如果两个都为空,直接返回 nullif(root1 == null && root2 == null){return null;}// 两个都不为空或者,一个为空if(root1 == null){return root2; }if(root2 == null){return root1;}TreeNode root = new TreeNode(root1.val + root2.val);root.left = mergeTrees(root1.left,root2.left);root.right = mergeTrees(root1.right,root2.right);return root;}
}

LeetCode 700 二叉搜索树中的搜索

在这里插入图片描述
本题思路:使用前序遍历,得到目标节点,返回直接返回即可
为了方便理解,画个图来演示下,这个流程。

  • 先遍历根节点,判断是否符合目标值在这里插入图片描述
  • 发现不符合,就开始递归判断,左树,此时发现符合目标值,于是将这个节点接收在这里插入图片描述
  • 然后开始递归判断右树在这里插入图片描述
  • 进入右树,最终没有符合的就返回 null 接收
  • 最后哪个树返回的不是null,就返回哪个节点
class Solution {public TreeNode searchBST(TreeNode root, int val) {return preorder(root,val);}public TreeNode preorder(TreeNode node, int val){if(node == null){return null;}if(node.val == val){return node;}TreeNode resleft = preorder(node.left,val);TreeNode resright = preorder(node.right,val);return resleft == null?resright:resleft;}
}

LeetCode 98 验证二叉搜索树

在这里插入图片描述
在这里插入图片描述

本题思路: 二叉搜索树的中序遍历,是有序单调递增的。所以我的思路是,用中序遍历得到一个列表。然后判断是否是单调递增即可

  • 示例1:得到的列表如下在这里插入图片描述
  • 示例2: 得到的列表如下在这里插入图片描述
  • 可以得到,是否是二叉搜索树,示例1是,示例2不是
class Solution {public boolean isValidBST(TreeNode root) {List<Integer> list = new ArrayList();inorder(root,list);for(int i = 1; i < list.size(); i++){if(list.get(i-1) >= list.get(i)){return false;}}return true;}public void inorder(TreeNode root,List<Integer> list){if(root == null){return;}inorder(root.left,list);list.add(root.val);inorder(root.right,list);}
}

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

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

相关文章

pytest装饰器:@pytest.mark.incremental

pytest.mark.incremental 是一个pytest中的装饰器&#xff0c;用于标记增量测试。增量测试是一种测试策略&#xff0c;它将测试分解成多个递增的步骤或阶段&#xff0c;并按顺序执行这些步骤。 pytest.mark.incremental 装饰器的作用是告诉pytest&#xff0c;该测试函数是一个…

c语言-整型在内存的存储

文章目录 前言一、整型数值在内存中的存储1.1 整型数值的表示形式1.2 二进制的表示形式1.3 整数在内存中存储 二、大端字节序存储和小端字节序存储2.1 大端字节序存储2.2 小端字节序存储2.3 练习 总结 前言 本篇文章叙述c语言中整型数据在内存中的存储方式。 一、整型数值在内…

Vue学习计划-Vue3--核心语法(一)OptionsAPI、CompositionAPI与setup

1. OptionsAPI与CompositionAPI Vue2的API设计是Options(配置)风格的Vue3的API设计是Composition(组合)风格的 Options API的弊端&#xff1a; Options类型的API&#xff0c;数据、方法、计算属性等&#xff0c;是分散在&#xff1a;data、methods、computed中的&#xff0c;若…

【操作系统xv6】学习记录2 -RISC-V Architecture

说明&#xff1a;看完这节&#xff0c;不会让你称为汇编程序员&#xff0c;知识操作系统的前置。 ref&#xff1a;https://binhack.readthedocs.io/zh/latest/assembly/mips.html https://www.bilibili.com/video/BV1w94y1a7i8/?p7 MIPS MIPS的意思是 “无内部互锁流水级的微…

Maple 2021安装包下载及安装教程

Maple 2021下载链接&#xff1a;https://docs.qq.com/doc/DUk9MQ1BPRHRYWU9s 1.鼠标右键解压到“Maple 2021” 2.选中Setup&#xff0c;鼠标右击选择“以管理员身份运行” 3.点击“Next” 4.选择I accept the agreement&#xff0c;点击“Next” 5.选择软件安装路径&#xff0c…

YOLOv8-Seg改进:Backbone改进 | 支持restnet50和restnet101

🚀🚀🚀本文改进: 将restnet50和restnet101作为backbone引入到YOLOv8-seg,下表为参数量和计算量的对比 layersparametersgradientsGFLOPsyolov8m-seg3312724022727240211

数据库系统原理例题之——数据管理技术的发展

数据管理技术的发展 第八章 数据管理技术的发展【例题】一 、单选题二 、填空题【答案&解析】一、单选题二、填空题【延伸知识点】【延伸知识点答案&解析】第八章 数据管理技术的发展 【例题】 一 、单选题 69.由数据结构 、关系操作和数据完整性三部分组成的是( ) …

IDEA JAVA Spring Boot运行Hello World(1.8)

参考资料&#xff1a; Spring Boot运行Hello World - 知乎https://blog.csdn.net/weixin_44005516/article/details/108293228(解决bug)SpringBoot入门第一章&#xff1a;Hello World-java教程-PHP中文网 (仅参考如何运行程序)java 8安装教程 java 8安装教程_java8安装-CSDN博…

uView Button 按钮

该组件内部实现以uni-appbutton组件为基础&#xff0c;进行二次封装&#xff0c;主要区别在于&#xff1a; 按钮type值有更多的主题颜色按钮size值有更多的尺寸可选 注意 此组件内部使用uni-appbutton组件为基础&#xff0c;除了开头中所说的增加的功能&#xff0c;另外暴露…

力扣:763. 划分字母区间(贪心,哈希)

题目&#xff1a; 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度…

SpringBoot集成MQTT协议

简介 MQTT 可以被解释为一种低开销&#xff0c;低带宽占用的即时通讯协议&#xff0c;可以用较少的代码和带宽为远程设备连接提供实时可靠的消息服务&#xff0c;它适用于硬件性能低下的远程设备以及网络状况糟糕的环境下&#xff0c;因此 MQTT 协议在 IoT&#xff08;Interne…

1月3日代码随想录反转二叉树

226翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,…

Java---- 静态内部类与非静态内部类的区别

在面试中回答的很不全&#xff0c;所以再此做一个总结。 1 static 静态修饰符 在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的。 static修饰表示静态的&#xff0c;在类加载时JVM会把它放到方法区&#xff0c;被本类以及本类中所有实例所公用。在编译后所分…

原生JS做别踩白块游戏

思路 创建初始一个按钮并为他添加点击监听开始创建随机方块&#xff0c;并样式_box.offsetTop speed px结合setInterval使得方块不断下移创建和删除方块的原则&#xff1a;box.offsetTop>0&#xff08;可视区上部没有方块了&#xff09;时候需要创建一行方块&#xff0c;…

江西速欣商务咨询有限公司:深度解析停息挂账,助您财务重启

停息挂账问题可能对个人或企业财务产生严重影响&#xff0c;但江西速欣商务咨询有限公司以其深度解析停息挂账的专业能力&#xff0c;致力于助您重新启动财务&#xff0c;实现财务的良性发展。 专业团队&#xff0c;深度解析挂账难题 速欣商务咨询拥有一支专业团队&#xff0c…

域名授权验证系统PHP源码,盗版追踪、双重授权和在线加密功能,附带安装教程

源码介绍 PHP域名授权验证系统是一个功能强大的系统&#xff0c;提供了多项功能来保护你的域名和软件的合法性。它包括盗版追踪、域名IP双重授权、在线加密等功能&#xff0c;同时还提供了PHP授权验证更新系统的完整版&#xff0c;方便你进行一键更新和生成自助授权。 盗版追…

【谷歌云】注册谷歌云 创建Compute Engine

文章目录 一、Google Cloud注册1.1 账号信息1.2 付款信息验证1.3 验证成功 二、Compute Engine创建2.1 启动Compute Engine API2.2 创建实例2.3 新建虚拟机实例2.4 等待实例创建完成2.5 查看虚拟机配置信息2.6 创建防火墙规则2.7 SSH远程连接虚拟机 三、参考链接 一、Google Cl…

ChatGPT 4.0真的值得花钱买入吗?

性能提升&#xff1a; ChatGPT 4.0的推出不仅意味着更先进的技术&#xff0c;还代表着更强大的性能。相较于3.5&#xff0c;4.0在处理任务时更为高效&#xff0c;响应更迅速。 更智能的理解&#xff1a; 随着版本的升级&#xff0c;ChatGPT 4.0对语境的理解能力得到了进一步的…

集群部署篇--Redis 集群动态伸缩

文章目录 前言一、redis 节点的添加1.1 redis 的实例部署&#xff1a;1.2 redis 节点添加&#xff1a;1.3 槽位分配&#xff1a;1.4 添加从节点&#xff1a; 二、redis 节点的减少2.1 移除主节点2.1.1 迁移槽位2.1.1 删除节点&#xff1a; 三、redis 删除节点的重新加入3.1 加入…

hibernate入门笔记

如何使用 导入依赖 <dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.19</version></dependency><dependency><groupId>org.hibernate<…