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

news2024/12/26 23:03:42

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) {
        // 如果两个都为空,直接返回 null
        if(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.coloradmin.cn/o/1352287.html

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

相关文章

Jmeter二次开发实操问题汇总(JDK问题,jar包问题)

前提 之前写过一篇文章&#xff1a;https://qa-lsq.blog.csdn.net/article/details/119782694 只是简单尝试了一下生成一个随机手机号码。 但是如果在工作中一个实际场景要用的二次开发&#xff0c;可能会遇到一些问题。 比如这样一个场景&#xff1a; Mobile或者前端调用部分…

【数据结构】堆的实现及TOP-K问题

文章目录 前言1. 堆的概念及结构2. 堆的实现2.1 堆向上调整算法2.2 堆向下调整算法2.3 堆的创建2.4 堆的删除2.5 堆的常用接口代码实现 3. 堆的应用TOP-K问题 前言 在正式讲堆之前&#xff0c;我们要先来讲一下二叉树的顺序结构&#xff1a; 普通的二叉树是不适合用数组来存储…

Python 实现给 pdf 文件自动识别标题并增添大纲

一、背景&#xff1a; 客户方提供过来一个开放平台的pdf文档&#xff0c;文档里有几十个接口&#xff0c;没有大纲和目录可以定位到具体内容&#xff0c;了解整体的API功能&#xff0c;观看体验极度差劲&#xff0c;所以想使用Python代码自动解析pdf文档&#xff0c;给文档增添…

AntDB设计之CheckPoint——引言与功能简述

1.引言 数据库服务能力提升是一项系统性的工程&#xff0c;在不同的应用场景下&#xff0c;用户对于数据库各项能力的关注点也不同&#xff0c;如&#xff1a;读写延迟、吞吐量、扩展性、可靠性、可用性等等。国内不少数据库系统通过系统架构优化、硬件设备升级等方式&#xf…

【单片机 TB作品】节拍器,电子音乐节拍器,51单片机,Proteus仿真

节拍器的使用可以使练琴者正确掌握乐曲的速度,从而使音 乐练习达到事半功倍的效果。本课题基于单片机设计具有声光晋 示的电子乐器节拍器,充分利用单片机的定时和中断系统,通过 C语言程序设计,控制外部相关硬件电路,实现对音乐速,度 40~120次/分钟范围内连续可调,节拍114、 2/4…

Redis命令---Hash(哈希)篇 (超全)

目录 1.Redis Hmset 命令 - 同时将多个 field-value (域-值)对设置到哈希表 key 中。简介语法可用版本: > 2.0.0返回值: 如果命令执行成功&#xff0c;返回 OK 。 示例 2.Redis Hmget 命令 - 获取所有给定字段的值简介语法可用版本: > 2.0.0返回值: 一个包含多个给定字段…

Simple Facebook Sign-In

简单的Facebook登录为Android、iOS、Windows、Mac、通用Windows平台(UWP)和Unity制作的WebGL应用程序提供了基于OAuth 2.0的Facebook登录。 优点: ● 跨平台游戏和应用程序的跨平台用户身份验证 ● 无插件,无第三方库,无依赖● 对建筑规模没有影响 ● 客户端-服务器应…

PMP证书可以挂靠吗?

PMP证书不是国内的证书&#xff0c;挂靠不了呀&#xff0c;想挂靠&#xff0c;可以考软考/一建等&#xff0c;里面也有项目管理相关的证书。 PMP证书虽然不能挂靠&#xff0c;但是用处还是很大的&#xff0c;例如提升个人能力、薪资待遇&#xff0c;还有持证可享一些城市的福利…

kafka容灾演练的方案

背景 kafka可以通过MirrorMaker工具把集群的数据从一个集群同步到另一个集群&#xff0c;通过在另一个数据中心创建灾备集群的方式可以做到容灾的效果,但是如果我们不通过如此重量级的工具也想达到容灾演练的目的&#xff0c;可以怎么做呢 kafka简单容灾实现 当原kafka集群发…

计算机网络--作业

作业一 1、比较电路交换、报文交换和分组报文交换优缺点 电路交换 电路交换是以电路连接为目的的交换方式&#xff0c;通信之前要在通信双方之间建立一条被双方独占的物理通道&#xff08;由通信双方之间的交换设备和链路逐段连接而成&#xff09;。 优点&#xff1a; ①由于…

MyBatis学习一:快速入门

前言 公司要求没办法&#xff0c;前端也要了解一下后端知识&#xff0c;这里记录一下自己的学习 学习教程&#xff1a;黑马mybatis教程全套视频教程&#xff0c;2天Mybatis框架从入门到精通 文档&#xff1a; https://mybatis.net.cn/index.html MyBatis 快速入门&#xf…

HackTheBox - Medium - Linux - Bagel

Bagel 今天我开始了《Red Team Development and Operations A Practical Guide》的学习&#xff0c;保持学习&#xff0c;后面差不多到时机后就学CRTOⅡ Bagel 是一款中等难度的 Linux 机器&#xff0c;其特点是电子商店容易受到路径遍历攻击&#xff0c;通过该攻击可以获取应…

Tinker 环境下数据表的用法

如果我们要自己手动创建一个模型文件&#xff0c;最简单的方式是通过 make:model 来创建。 php artisan make:model Article 删除模型文件 rm app/Models/Article.php 创建模型的同时顺便创建数据库迁移 php artisan make:model Article -m Eloquent 表命名约定 在该文件中&am…

k8s中实现pod自动扩缩容

一、k8s应用自动扩缩容概述 1&#xff09;背景&#xff1a; 在实际的业务场景中&#xff0c;我们经常会遇到某个服务需要扩容的场景&#xff08;例如&#xff1a;测试对服务压测、电商平台秒杀、大促活动、或由于资源紧张、工作负载降低等都需要对服务实例数进行扩缩容操作&…

SD-WAN组网方式详解

企业网络的演进势不可挡&#xff0c;对于高效、可靠的网络连接需求日益增加。SD-WAN&#xff08;软件定义广域网&#xff09;作为一项创新的网络技术&#xff0c;备受企业青睐并得到广泛应用。SD-WAN提供了多种灵活的组网方式&#xff0c;以满足企业多样化的需求和不同的网络环…

AI实景无人直播创业项目:开启自动直播新时代,一部手机即可实现财富增长

在当今社会&#xff0c;直播已经成为了人们日常生活中不可或缺的一部分。无论是商家推广产品、明星互动粉丝还是普通人分享生活&#xff0c;直播已经渗透到了各行各业。然而&#xff0c;传统直播方式存在着一些不足之处&#xff0c;如需现场主持人操作、高昂的费用等。近年来&a…

亚信安慧AntDB数据库引领数字时代:数字驱动创新峰会主旨演讲深度解析

近日&#xff0c;庄严肃穆的数字驱动创新峰会在中国首都北京隆重召开&#xff0c;聚焦于探讨数据经济的创新前沿。在此次盛会中&#xff0c;备受瞩目的亚信安慧AntDB数据库荣幸受邀参与&#xff0c;该数据库的副总裁张桦以其深刻见解和卓越经验发表了引人瞩目的主旨演讲。 图1&…

立体匹配算法(Stereo correspondence)

SGM(Semi-Global Matching)原理&#xff1a; SGM的原理在wiki百科和matlab官网上有比较详细的解释&#xff1a; wiki matlab 如果想完全了解原理还是建议看原论文 paper&#xff08;我就不看了&#xff0c;懒癌犯了。&#xff09; 优质论文解读和代码实现 一位大神自己用c实现…

系列九、Feign

一、Feign 1.1、Java中如何实现跨接口调用 &#xff08;1&#xff09; Httpclient Httpclient是Apache Jakarta Comon下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包&#xff0c;并且它支持HTTP协议的最新版本和建议。HttpC…

鸿蒙原生应用再添新丁!中国移动 入局鸿蒙

鸿蒙原生应用再添新丁&#xff01;中国移动 入局鸿蒙 来自 HarmonyOS 微博1月2日消息&#xff0c;#中国移动APP启动鸿蒙原生应用开发#&#xff0c;拥有超3亿用户的中国移动APP宣布&#xff0c;正式基于HarmonyOS NEXT启动#鸿蒙原生应用#及元服务开发。#HarmonyOS#系统的分布式…