代码随想录第20天| 654.最大二叉树 617.合并二叉树

news2024/9/20 20:35:28

 654.最大二叉树

654. 最大二叉树 - 力扣(LeetCode)

代码随想录 (programmercarl.com)

又是构造二叉树,又有很多坑!| LeetCode:654.最大二叉树_哔哩哔哩_bilibili

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

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

返回 nums 构建的 最大二叉树 

示例 1:

输入:nums = [3,2,1,6,0,5]
输出:[6,3,5,null,2,0,null,null,1]
解释:递归调用如下所示:
- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5] 。
    - [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1] 。
        - 空数组,无子节点。
        - [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1] 。
            - 空数组,无子节点。
            - 只有一个元素,所以子节点是一个值为 1 的节点。
    - [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 [] 。
        - 只有一个元素,所以子节点是一个值为 0 的节点。
        - 空数组,无子节点。

示例 2:

输入:nums = [3,2,1]
输出:[3,null,2,null,1]

提示:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 1000
  • nums 中的所有整数 互不相同

这个题一开始读题没怎么读懂且有非常多的疑惑,比如最大值不在中间在两端的话怎么办?那这棵树是不是就瘸了?比如左右子树怎么构造?是不是要比较大小?

于是我就去看卡哥题解了。看了发现我没抓住重点。比如这个题的遍历方式应该为前序遍历,而且构造树的遍历方式都应该为前序遍历。这是因为构造树的时候需要先构造根节点,然后左右孩子才有着陆点。

递归三部曲:

1、确定参数和返回值:参数传入的是存放数值的元组,返回类型是指向节点的指针

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

2、确定终止条件:当递归遍历的时候,数组大小为1时,说明遍历到了叶子节点,终止遍历。

// 如果右边界索引减左边界索引等于 1,说明只有一个元素,返回包含该元素的新节点
if (rightIndex - leftIndex == 1) {
    return new TreeNode(nums[leftIndex])
}

3、确定单层递归的逻辑:

先找到数组中最大的值和对应的下标, 最大的值构造根节点,下标用来下一步分割数组。

public TreeNode constructMaximumBinaryTree1(int[] nums, int leftIndex, int rightIndex){
    if(rightIndex - leftIndex < 1){
        return null;
    }
    if(rightIndex - leftIndex == 1){
        return new TreeNode(nums[leftIndex]);
    }
    int maxIndex = leftIndex;
    int maxVal = nums[maxIndex];
    for(int i = leftIndex + 1; i < rightIndex; i++){
        if(nums[i] > maxVal) {
            maxVal = nums[i];
            maxIndex = i;
        }
    }
}

最大值所在的下标左区间 构造左子树;最大值所在的下标右区间 构造右子树

        TreeNode root = new TreeNode(maxVal);
        // 根据maxIndex划分左右子树
        root.left = constructMaximumBinaryTree1(nums, leftIndex, maxIndex);
        root.right = constructMaximumBinaryTree1(nums, maxIndex + 1, rightIndex);
        return root;

综合代码:

class Solution {
    // 构建最大二叉树的入口函数,传入整数数组 nums
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        // 调用辅助函数 constructMaximumBinaryTree1,传入数组 nums、左边界索引 0 和右边界索引 nums.length
        return constructMaximumBinaryTree1(nums, 0, nums.length);
    }

    // 辅助函数,用于构建最大二叉树,传入数组 nums、左边界索引 leftIndex 和右边界索引 rightIndex
    public TreeNode constructMaximumBinaryTree1(int[] nums, int leftIndex, int rightIndex) {
        // 如果右边界索引减左边界索引小于 1,说明没有元素了,返回 null
        if (rightIndex - leftIndex < 1) {
            return null;
        }
        // 如果右边界索引减左边界索引等于 1,说明只有一个元素,返回包含该元素的新节点
        if (rightIndex - leftIndex == 1) {
            return new TreeNode(nums[leftIndex]);
        }
        // 初始化最大值所在位置为左边界索引,最大值为对应位置的数组元素
        int maxIndex = leftIndex;
        int maxVal = nums[maxIndex];
        // 遍历数组,找到最大值及其所在位置
        for (int i = leftIndex + 1; i < rightIndex; i++) {
            if (nums[i] > maxVal) {
                maxVal = nums[i];
                maxIndex = i;
            }
        }
        // 创建根节点,值为最大值
        TreeNode root = new TreeNode(maxVal);
        // 根据最大值所在位置将数组划分为左右两部分,分别递归构建左右子树
        root.left = constructMaximumBinaryTree1(nums, leftIndex, maxIndex);
        root.right = constructMaximumBinaryTree1(nums, maxIndex + 1, rightIndex);
        return root; // 返回根节点
    }
}

 

617.合并二叉树 

617. 合并二叉树 - 力扣(LeetCode)

代码随想录 (programmercarl.com)

一起操作两个二叉树?有点懵!| LeetCode:617.合并二叉树_哔哩哔哩_bilibili

给你两棵二叉树: root1 和 root2 。

想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。

返回合并后的二叉树。

注意: 合并过程必须从两个树的根节点开始。

示例 1:

输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
输出:[3,4,5,5,4,null,7]

示例 2:

输入:root1 = [1], root2 = [1,2]
输出:[2,2]

提示:

  • 两棵树中的节点数目在范围 [0, 2000] 内
  • -104 <= Node.val <= 104

第一想法是将两个二叉树同时遍历,如果相同位置都有值则把同位置的值相加后放到新二叉树的同一位置上;如果同一位置上,有一颗二叉树没有值,则把另外一个有值的值放到新二叉树的对应位置上。但是代码实现没想法。

看了题解:

递归三部曲:

1、确定参数和返回值:参数是要传入两个二叉树的根节点,返回值就是合并之后二叉树的根节点。

public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
    return root1;
}

2、确定终止条件:

因为是传入了两个树,那么就有两个树遍历的节点t1 和 t2,如果t1 == NULL 了,两个树合并就应该是 t2 了(如果t2也为NULL也无所谓,合并之后就是NULL)。

反过来如果t2 == NULL,那么两个数合并就是t1(如果t1也为NULL也无所谓,合并之后就是NULL)。

// 如果root1为空,返回root2,表示以root2为基准进行合并
        if (root1 == null) return root2;
        // 如果root2为空,返回root1,表示以root1为基准进行合并
        if (root2 == null) return root1;

3、确定单层递归的逻辑:

// 将root2的值加到root1的值上
        root1.val += root2.val;
        // 递归合并左子树,将合并结果赋给root1的左子树
        root1.left = mergeTrees(root1.left, root2.left);
        // 递归合并右子树,将合并结果赋给root1的右子树
        root1.right = mergeTrees(root1.right, root2.right);
        // 返回合并后的root1树
        return root1;

综合代码:

class Solution {
    // 定义一个类Solution,用于解决问题
    // 递归函数,合并两棵二叉树,参数为树的根节点root1和根节点root2
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        // 如果root1为空,返回root2,表示以root2为基准进行合并
        if (root1 == null) return root2;
        // 如果root2为空,返回root1,表示以root1为基准进行合并
        if (root2 == null) return root1;

        // 将root2的值加到root1的值上
        root1.val += root2.val;
        // 递归合并左子树,将合并结果赋给root1的左子树
        root1.left = mergeTrees(root1.left, root2.left);
        // 递归合并右子树,将合并结果赋给root1的右子树
        root1.right = mergeTrees(root1.right, root2.right);
        // 返回合并后的root1树
        return root1;
    }
}

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

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

相关文章

基于java+springboot+vue实现的医院门诊信息管理系统(文末源码+Lw+ppt)23-325

摘 要 系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对医院门诊信息的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而…

不敢想象吧!Anzo Capital发现不仅经济事件影响汇率天气也是

在投资交易中弄懂汇率的走势方向&#xff0c;对各位投资者的交易盈利那还不是小菜一碟&#xff0c;但各位投资者你们想象不到吧&#xff01;Anzo Capital发现不仅经济事件能影响汇率&#xff0c;就连天气也能轻易影响汇率。 就用2015年1月15日的经济事件来说&#xff0c;当瑞…

pandas读写excel,csv

1.读excel 1.to_dict() 函数基本语法 DataFrame.to_dict (self, orientdict , into ) --- 官方文档 函数种只需要填写一个参数&#xff1a;orient 即可 &#xff0c;但对于写入orient的不同&#xff0c;字典的构造方式也不同&#xff0c;官网一共给出了6种&#xff0c…

基于springboot+vue的流浪动物管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

2002-2023年各地级市环境规制强度数据(环保词频统计)

2002-2023年各地级市环境规制强度数据&#xff08;环保词频统计&#xff09; 1、时间&#xff1a;2002-2023年 2、来源&#xff1a;政府工作报告 3、指标&#xff1a; 行政区划代码、年份、城市、所属省份、文本总长度、仅中英文-文本总长度、文本总词频-全模式、文本总词频…

快速熟悉ElasticSearch的基本概念

1.全文检索 全文检索是通过文本内容进行全面搜索的技术。通过全文检索可以快速地在大量文本数据中查找包含特定关键词或者短语的文档&#xff0c;并且返回相关的搜索结果。 检索和查询的区别 检索没有搜索条件边界&#xff0c;检索的结果取决于相关性&#xff0c;相关性计算…

ssm004新生报到系统+jsp

新生报到系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对新生报到信息管理混乱&#xff0c;出错率…

JS运行时大盘点,出新JS运行时了!

大家好&#xff0c;我是奇兵&#xff0c; 在前端技术日新月异的今天&#xff0c;新的 JavaScript 运行时环境不断涌现&#xff0c;它们为开发者提供了更多的选择和可能性。近期&#xff0c;诸如 LLRT 和 WinterJS 等新运行时环境的发布&#xff0c;进一步丰富了 JavaScript 运…

实战 | 任意密码重置+CRRF

一、XSS漏洞 在商城的搜索处&#xff0c;输入标准语句的传参直接就可以弹窗 二、逻辑漏洞-用户枚举 在用户注册界面&#xff0c;点击发送验证码&#xff0c;然后用BURP发包 更改手机号传参&#xff0c;这里手机号传参没有进行加密&#xff0c;直接用手机号的位置进行爆破 正确的…

cad怎么画洗菜盆平面图?

CAD绘制住宅平面布置图的时候&#xff0c;特别是对厨房区域的绘制时&#xff0c;需要使用到洗菜盆图块该怎么绘制洗菜盆平面图呢&#xff1f;下面我们就来看看详细的教程。 1、打开AutoCAD 2013软件&#xff0c;点击【图层特性管理器】&#xff0c;点击【新建图层】&#xff0…

maya打开bvh脚本

目录 maya打开脚本编辑器 运行打开bvh脚本 maya导出bvh脚本 maya打开脚本编辑器 打开Maya软件&#xff0c;点击右下角 “脚本编辑器” 运行打开bvh脚本 https://github.com/jhoolmans/mayaImporterBVH/blob/master/bvh_importer.py import os import re from typing impo…

Redis消息队列与thinkphp/queue操作

业务场景 场景一 用户完成注册后需要发送欢迎注册的问候邮件、同时后台要发送实时消息给用户对应的业务员有新的客户注册、最后将用户的注册数据通过接口推送到一个营销用的第三方平台。 遇到两个问题&#xff1a; 由于代码是串行方式&#xff0c;流程大致为&#xff1a;开…

关于网格数据导出指定格式的测试(以Gmsh导出nas格式为例)

本文主要讲述Gmsh如何导出nas格式的网格数据&#xff0c;众所周知&#xff0c;Gmsh可以导出多种网格数据格式&#xff0c;比如大家熟悉的msh、stl、inp、cgns&#xff08;似乎不完善&#xff09;等等&#xff0c;但是gmsh不支持nas格式的导出&#xff0c;只支持nas格式的导入&a…

基于java+springboot+vue实现的图书借阅系统(文末源码+Lw+ppt)23-328

摘 要 伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对系统进行规范而严格是十分有必要的&#xff0c;所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套“期待相遇”图书借阅系统&#xff0c;帮助商…

Harmony(鸿蒙)Stage模型综述

设计思想 ​Stage模型的设计&#xff0c;是为了提供给开发者一个更好的开发方式&#xff0c;更好的适用于多设备、分布式场景。 ​Stage模型的设计思想如下图所示。 ​Stage模型的设计基于如下三个出发点&#xff1a; 应用进程的有序管理 随着设备的内存越来越大&#xff0…

【docker】查看并拷贝容器内文件

一、查询容器 查询所有容器 docker ps查询名为os11的容器 docker ps | grep os11查询名为os11的容器&#xff08;包含不运行的&#xff09; docker ps -a| grep os11 docker ps [option] 显示结果介绍如下&#xff1a; 参考&#xff1a;[https://blog.51cto.com/u_15009374/31…

详解华为软件研发管理IPD

IPD,即集成产品开发(Integrated Product Development),是一种综合多种管理模型和理论、企业最佳实践的管理体系。旨在帮助企业快速适应市场变化,缩短产品上市时间,减少资源浪费,并提高生产力,以实现商业成功。 IPD的核心是跨部门团队的合作,涉及市场、研发、制造、服…

java项目将静态资源中的文件转为浏览器可访问的http地址

新增一个类叫啥无所谓&#xff0c;主要是实现 WebMvcConfigurer 加上注解 Configuration项目启动时加入bean中 只操作addResourceHandlers这一个方法 其他都没用 文章下方附带一个简易的上传图片代码 package cn.exam.config;import org.springframework.context.annotati…

Java代码基础算法练习-字符串反转-2024.03.25

任务描述&#xff1a; 输入一个字符串&#xff0c;然后将此字符串反转&#xff08;字符串最长不超过25个字符&#xff09; 任务要求&#xff1a; 代码示例&#xff1a; package M0317_0331;import java.util.Scanner;public class m240325_1 {public static void main(String…

Mysql锁及适用场景

一、mysql中的锁有哪些&#xff1f; 1.1 锁的类型 &#xff08;1&#xff09;共享锁&#xff08;Shared Lock&#xff09;&#xff1a; 共享锁允许事务读取数据&#xff0c;但不允许其他事务修改数据。多个事务可以同时持有共享锁。 -- 事务A获取共享锁 START TRANSACTION; …