代码学习记录16

news2024/9/23 17:17:45

随想录日记part16

t i m e : time: time 2024.03.11



主要内容:今天的主要内容是二叉树的第五部分,主要涉及最大二叉树;合并二叉树;二叉搜索树的搜索;验证二叉搜索树。

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


Topic1最大二叉树

题目:

给定一个不重复的整数数组 n u m s nums nums 。 最大二叉树可以用下面的算法从 n u m s nums nums 递归地构建:

  • 创建一个根节点,其值为 n u m s nums nums 中的最大值。
  • 递归地在最大值左边的数组前缀上构建左子树。
  • 递归地在最大值右边的子数组后缀上构建右子树.

返回 nums 构建的 最大二叉树 。
示例:
请添加图片描述

输入: n u m s = [ 3 , 2 , 1 , 6 , 0 , 5 ] nums = [3,2,1,6,0,5] nums=[3,2,1,6,0,5]
输出: [ 6 , 3 , 5 , n u l l , 2 , 0 , n u l l , n u l l , 1 ] [6,3,5,null,2,0,null,null,1] [6,3,5,null,2,0,null,null,1]

思路:

最大二叉树的构建过程如下:请添加图片描述
构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。

  • 确定递归函数的参数和返回值
TreeNode constructMaximumBinaryTree(int[] nums)
  • 确定终止条件
   // 1,如果数组大小为0,说明为空节点;
   if (begin >= end) return null;
  • 确定单层递归的逻辑:1.先要找到数组中最大的值和对应的下标;2,最大值所在的下标左区间 构造左子树;3.最大值所在的下标右区间 构造右子树
   // 2.找出其中最大值对应的索引
   int index = MaxValueIndex(nums, begin, end);
   TreeNode tem = new TreeNode(nums[index]);
   //3.最大值所在的下标左区间 构造左子树
   tem.left = createMaxTree(nums, begin, index);
   //4.最大值所在的下标右区间 构造右子树
   tem.right = createMaxTree(nums, index + 1, end);

总体代码如下:

class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        return createMaxTree(nums, 0, nums.length);
    }

    private TreeNode createMaxTree(int[] nums, int begin, int end) {// 左闭右开
        // 1,如果数组大小为0,说明为空节点;
        if (begin >= end)
            return null;
        // 2.找出其中最大值对应的索引
        int index = MaxValueIndex(nums, begin, end);
        TreeNode tem = new TreeNode(nums[index]);
        tem.left = createMaxTree(nums, begin, index);
        tem.right = createMaxTree(nums, index + 1, end);
        return tem;
    }

    private int MaxValueIndex(int[] nums, int begin, int end) {// 查找最大值的对应索引的函数
        int maxKey = -1;
        int maxValue = Integer.MIN_VALUE;
        for (int i = begin; i < end; i++) {
            if (nums[i] > maxValue) {
                maxValue = nums[i];
                maxKey = i;
            }
        }
        return maxKey;
    }
}


Topic2合并二叉树

题目:

给你两棵二叉树: r o o t 1 root1 root1 r o o t 2 root2 root2
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 n u l l null null 的节点将直接作为新二叉树的节点。返回合并后的二叉树。
注意: 合并过程必须从两个树的根节点开始。

请添加图片描述

输入: r o o t 1 = [ 1 , 3 , 2 , 5 ] , r o o t 2 = [ 2 , 1 , 3 , n u l l , 4 , n u l l , 7 ] root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7] root1=[1,3,2,5],root2=[2,1,3,null,4,null,7]
输出: [ 3 , 4 , 5 , 5 , 4 , n u l l , 7 ] [3,4,5,5,4,null,7] [3,4,5,5,4,null,7]

思路:

使用前序遍历的方法构建,其动画如下:
请添加图片描述

  • 确定递归函数的参数和返回值
TreeNode mergeTrees(TreeNode root1, TreeNode root2)
  • 确定终止条件
if (root1 == null && root2 == null)
	return null;
if (root1 == null && root2 != null)
	return root2;
if (root1 != null && 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);

总体代码如下: 递归法:

class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if (root1 == null && root2 == null)
            return null;
        if (root1 == null && root2 != null)
            return root2;
        if (root1 != null && 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;
    }
}


Topic3二叉搜索树中的搜索

题目:

给定二叉搜索树( B S T BST BST)的根节点 r o o t root root 和一个整数值 v a l val val。你需要在 B S T BST BST 中找到节点值等于 v a l val val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 n u l l null null
示例:
请添加图片描述

输入: r o o t = [ 4 , 2 , 7 , 1 , 3 ] , v a l = 2 root = [4,2,7,1,3], val = 2 root=[4,2,7,1,3],val=2
输出: [ 2 , 1 , 3 ] [2,1,3] [2,1,3]

思路:

递归法:直接递归就行,不难。

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


Topic4验证二叉搜索树

题目:

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:

  • 节点的左子树只包含小 当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。
    示例:
    请添加图片描述

输入: r o o t = [ 5 , 1 , 4 , n u l l , n u l l , 3 , 6 ] root = [5,1,4,null,null,3,6] root=[5,1,4,null,null,3,6]
输出: f a l s e false false
解释: 根节点的值是 5 5 5 ,但是右子节点的值是 4 4 4

思路:

中序遍历是符合二叉搜索树的查找规则的。

  • 确定递归函数的参数和返回值
boolean isValidBST(TreeNode root)
  • 确定终止条件
 if (root == null) return true;
  • 确定单层递归的逻辑:中序遍历,一直更新 $max%,一旦发现 m a x . v a l > = r o o t . v a l max.val>= root.val max.val>=root.val,就返回 f a l s e false false,注意元素相同时候也要返回 f a l s e false false
        // 左
        boolean left = isValidBST(root.left);
        if (left != true)
            return false;
        // 中
        if (max != null && max.val >= root.val)
            return false;
        max = root;
        // 右
        return isValidBST(root.right);

整体的代码如下:

class Solution {
    TreeNode max;

    public boolean isValidBST(TreeNode root) {
        if (root == null)
            return true;
        // 中序遍历
        // 左
        boolean left = isValidBST(root.left);
        if (left != true)
            return false;
        // 中
        if (max != null && max.val >= root.val)
            return false;
        max = root;
        // 右
        return isValidBST(root.right);
    }
}


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

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

相关文章

《Python深度学习》阅读笔记

以下是《Python深度学习》一书中学习过程中记录的一些重要的专属名词和概念&#xff1a; 一、概念 深度学习&#xff08;Deep Learning&#xff09;&#xff1a;指使用多层神经网络进行机器学习的技术。神经网络&#xff08;Neural Network&#xff09;&#xff1a;一种模仿生…

常用SQL语句大全

目录 目录 一.SQL概念 二.数据库操作 2.0.连接数据库 2.1创建数据库 2.2使用数据库 2.3切换数据库 2.4删除数据库(慎用&#xff01;&#xff01;) 2.5查询数据库 三.表操作 3.0了解数据类型和数据约束 3.1创建表 3.2查询表 3.3修改表 3.4删除表 四.数据操作 4…

【PTA】L1-032 L1-033(c)第六天

L1-032 Left-pad 分数 20 作者 陈越 单位 浙江大学 根据新浪微博上的消息&#xff0c;有一位开发者不满NPM&#xff08;Node Package Manager&#xff09;的做法&#xff0c;收回了自己的开源代码&#xff0c;其中包括一个叫left-pad的模块&#xff0c;就是这个模块把javas…

【开源-土拨鼠充电系统】鸿蒙 HarmonyOS 4.0+微信小程序+云平台

本人自己开发的开源项目&#xff1a;土拨鼠充电系统 ✍GitHub开源项目地址&#x1f449;&#xff1a;https://github.com/cheinlu/groundhog-charging-system ✍Gitee开源项目地址&#x1f449;&#xff1a;https://gitee.com/cheinlu/groundhog-charging-system ✨踩坑不易&am…

集合系列(一) -集合框架简介

一、集合类简介 Java集合就像一种容器&#xff0c;可以把多个对象&#xff08;实际上是对象的引用&#xff0c;但习惯上都称对象&#xff09;“丢进”该容器中。从Java 5 增加了泛型以后&#xff0c;Java集合可以记住容器中对象的数据类型&#xff0c;使得编码更加简洁、健壮。…

使用点链云管家创建瑜伽约课小程序

点链云管家 点链云管家是由上海点链科技开发的门店管理系统&#xff0c;为线下门店商家提供一站式门店运营服务平台解决方案&#xff0c;适用于瑜伽健身、美业、新零售会员制电商、母婴店、宠物店、按摩养生、服装、美容、美甲、汽车服务、商超零售、餐饮、KTV娱乐、干洗等18个…

如何在Linux使用docker部署Swagger Editor并实现无公网IP远程协同编辑API文档

目录 前言 Swagger Editor本地接口文档公网远程访问 1. 部署Swagger Editor 2. Linux安装Cpolar 3. 配置Swagger Editor公网地址 4. 远程访问Swagger Editor 5. 固定Swagger Editor公网地址 结语 前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 …

Linux的一些常用指令

一、文件中 r w x - 的含义 r&#xff08;read&#xff09;是只读权限&#xff0c; w&#xff08;write&#xff09;是写的权限&#xff0c; x&#xff08;execute&#xff09;是可执行权限&#xff0c; -是没有任何权限。 二、一些指令 # 解压压缩包 tar [-zxvf] 压缩包名…

springboot+ssm基于vue.js的客户关系Crm管理系统

系统包含两种角色&#xff1a;管理员、用户&#xff0c;主要功能如下。 ide工具&#xff1a;IDEA 或者eclipse 编程语言: java 数据库: mysql5.7 框架&#xff1a;ssmspringboot都有 前端&#xff1a;vue.jsElementUI 详细技术&#xff1a;springbootSSMvueMYSQLMAVEN 数据库…

揭秘动态住宅代理:如何合法获取全球数据洞察

文章目录 写在前面代理网络的崛起什么是代理网络&#xff1f;动态住宅代理的革命为什么选择亮数据动态代理 如何利用采集工具获取全球亮数据写在最后 写在前面 随着互联网技术的发展&#xff0c;数据已经成为企业生存和发展的不可或缺的资源。尤其在商业世界里&#xff0c;如何…

使用 ChatGPT 写高考作文

写作文&#xff0c;很简单&#xff0c;但写一篇好的作文&#xff0c;是非常有难度的。 想要写一篇高分作文&#xff0c;需要对作文题目有正确的理解&#xff0c;需要展现独到的观点和深入的思考&#xff0c;需要具备清晰的逻辑结构&#xff0c;需要准确而得体的语言表达。 正…

租个阿里云的服务器多少钱?30元、61元、99元、165元、199元

2024年租个阿里云的服务器多少钱&#xff1f;很便宜&#xff0c;云服务器2核2G3M固定带宽99元一年、2核4G服务器30元3个月、199元一年&#xff0c;轻量应用服务器2核2G3M配置61元一年、2核4G4M带宽165元一年&#xff0c;可以在阿里云CLUB中心查看 aliyun.club 当前最新的优惠券…

Elastic Agent 的安装及使用

概述 Elastic Agent是Elastic Stack中的一个全新组件&#xff0c;旨在简化和统一监控和集成管理流程。它是一个轻量级的代理&#xff0c;可以部署到各种不同类型的主机和容器中&#xff0c;用于收集系统指标、日志和事件数据&#xff0c;并将其发送到Elasticsearch进行存储和分…

【Qt】QListView 显示富文本,设置文本内容颜色

【Qt】QListView 显示富文本&#xff0c;设置文本内容颜色 文章目录 I - 控件使用II - 显示富文本III - 注意事项 I - 控件使用 Qt 的 MVC 架构为 MV &#xff0c;Controller 部分继承到了 View 里&#xff0c;View(视图) 设置 Model(模型)&#xff0c;Model 设置数据 这里使用…

新鲜出炉!界面控件DevExpress WinForms 2024产品路线图预览(三)

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

专业140+总400+重庆邮电大学801信号与系统考研经验重邮电子信息与通信工程,真题,大纲,参考书。

今年报考重庆邮电大学研究生&#xff0c;初试专业课801信号与系统140总分400&#xff0c;总结一下自己去年的复习经验&#xff0c;希望对大家复习有帮助。 专业课&#xff1a; 重邮专业801信号与系统难度中等&#xff0c;今年140算是正常发挥&#xff0c;没有达到Jenny老师要求…

【经验分享】Windows10无法通过SSHFS连接服务器

【经验分享】Windows10如何通过SSHFS连接服务器 前言问题分析解决方法 前言 现在很多公司出于成本考虑&#xff0c;不会为每一台电脑都提供高配置&#xff0c;所以需要通过访问云服务器来进行编译等操作。程序员如果配备的是一台windows电脑&#xff0c;那么需要访问linux服务…

Java复习04 注解和反射

Java复习04 注解和反射 初学 注解和反射的时候 我的问题是 什么是注解&#xff1f; 什么是反射&#xff1f;单例模式 Stream ForkJoin有什么区别&#xff1f; 注解的分类有哪些&#xff1f;怎么区分&#xff1f;反射的分类有哪些&#xff1f;怎么区分&#xff1f; 反射里面Con…

视频水印如何去除?看看这三款工具!

在处理视频内容时&#xff0c;经常会遇到带有水印的视频素材。这些水印有时会遮挡重要的视觉信息&#xff0c;或者影响视频的美观性。为了保持视频内容的完整性和专业性&#xff0c;一个高效的视频去水印工具就显得尤为重要。下面我为大家推荐三款能够轻松去除视频水印的工具。…

Qt+FFmpeg+opengl从零制作视频播放器-3.解封装

解封装&#xff1a;如下图所示&#xff0c;就是将FLV、MKV、MP4等文件解封装为视频H.264或H.265压缩数据&#xff0c;音频MP3或AAC的压缩数据&#xff0c;下图为常用的基本操作。 ffmpeg使用解封装的基本流程如下&#xff1a; 在使用FFmpeg API之前&#xff0c;需要先注册API&a…