算法力扣刷题记录 五十一【654.最大二叉树】

前言

二叉树篇,继续。
记录 五十一【654.最大二叉树】


一、题目阅读

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

  1. 创建一个根节点,其值为 nums 中的最大值。
  2. 递归地在最大值 左边子数组前缀上 构建左子树。
  3. 递归地在最大值 右边子数组后缀上 构建右子树。
  4. 返回 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. 题目定义如何构建最大二叉树,按照题目的递归思路即可以实现。
  2. 递归返回值:返回子树(树)的根节点;
  3. 递归参数:左子树/右子树的数组,所以参数vector< int >
  4. 递归终止条件:当数组为空,返回nullptr;当数组只有一个,可直接返回叶子节点(等同于根节点)。
  5. 递归逻辑:
  • 找到最大值。
  • 分割nums。
  1. 总结:整体思路类似记录 五十【106.从中序与后序遍历序列构造二叉树】拿到中间节点后分割中序数组。

代码实现

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {if(nums.size() == 0) return nullptr;if(nums.size() == 1){   //叶子自己就是根TreeNode* root = new TreeNode(nums[0]);return root;}//找最大值确定根节点,同时确定最大值的下标indexint maxnum = INT_MIN;int index = 0;for(int i = 0;i < nums.size();i++){if(nums[i] > maxnum){maxnum = nums[i];index = i;}}TreeNode* root = new TreeNode(maxnum);//区间左闭右开vector<int> left(nums.begin(),nums.begin()+index);vector<int> right(nums.begin()+index+1,nums.end());root->left = constructMaximumBinaryTree(left);root->right = constructMaximumBinaryTree(right);return root;}
};

三、参考学习

参考学习链接

学习内容

  1. 题目属于构造二叉树类型,遍历顺序:前序——中左右。类似:记录 五十【106.从中序与后序遍历序列构造二叉树】 ,同理构造顺序——中左右。

  2. 思路同理。和二、中的思路一致。但是有点区别——如果终止条件判断nums是否为空,那么“传递”下一层不用判断index值;如果终止条件默认nums不为空,那么“传递”下一层要if(index条件)。

  3. 代码优化:不创建新数组传递。只传递下标值

    /*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
    class Solution {
    public:TreeNode* build(vector<int>& nums,int begin,int end){if(begin == end) return nullptr;if(end - begin == 1){TreeNode* root = new TreeNode(nums[begin]);return root;}int maxvalue = 0;//因为题目中说元素值最小是0int index = begin;//从begin开始判断for(int i = begin;i < end;i++){if(nums[i] > maxvalue){maxvalue = nums[i];index = i;}}int leftbegin = begin;int leftend = index;int rightbeign = index+1;int rightend = end;TreeNode* root = new TreeNode(maxvalue);root->left = build(nums,leftbegin,leftend);root->right = build(nums,rightbeign,rightend);return root;}TreeNode* constructMaximumBinaryTree(vector<int>& nums) {return build(nums,0,nums.size());}
    };
    

总结

记录 五十一【654.最大二叉树】和记录 五十【106.从中序与后序遍历序列构造二叉树】可以归为一类。

可以改进成:只传递下标值,每次不创建新数组,不开辟新空间更好

(欢迎指正,转载标明出处)

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

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

相关文章

分享5款免费在线ps网页版工具,在线ps图片编辑器

在线PS&#xff0c;即在线Photoshop&#xff0c;是一种无需下载和安装即可在浏览器中使用的图片处理工具。这类工具通常提供与桌面版Photoshop相似的功能&#xff0c;包括但不限于图像编辑、调整、美化等。小编为大家收集整理了5款免费在线PS网页版工具&#xff0c;方便有需要的…

如何利用windows本机调用Linux服务器,以及如何调用jupyter界面远程操控

其实这篇文章没必要存在&#xff0c;教程太多了 参考博客&#xff08;1 2 3&#xff09;&#xff0c;如侵删 奈何网上的大神总是会漏掉一些凡人遇到的小问题 &#xff08;1&#xff09; 建议下载PuTTy for windows&#xff0c;从而建立与远程服务器的SSH连接 需要确认目标服…

实验六:频域图像增强方法

一、实验目的 熟练掌握频域滤波增强的各类滤波器的原理及实现。分析不同用途的滤波器对频域滤波增强效果的影响,并分析不同的滤波器截止频率对频域滤波增强效果的影响。二、实验原理 ① Butterworth 低通滤波器:一种具有最大平坦通带幅度响应的滤波器。它的特点是在通带内具…

JAVA面向对象03

基本类型的包装类 拆包–>封包 拆包–>包装类型转换基本数据类型 封包—>基本数据类型转换包装类型 编号基本数据类型包装类型1byteByte2shortShort3charCharacter4intInteger5longLonLong6floatFloat7doubleDouble8booleanBoolean 使用包装类型的原因 java是一…

【JDK切换】切换JDK版本

众所周知&#xff1a; 现在springboot框架创建的jdk版本已经没有1.8了&#xff0c;但是有的项目运用的还是1.8&#xff0c;但新创建却不得不下载个新版本JDK&#xff0c;比如JDK22&#xff1a;https://download.csdn.net/download/sh1307212321/89556578 那么问题来了&#x…

DC系列靶场---DC 2靶场的渗透测试(一)

信息收集 Nmap扫描 nmap -sV -p- -sC -T4 172.30.1.141 域名解析 echo 172.30.1.141 dc-2 >> /etc/hosts 目录枚举 gobuster dir -u http://172.30.1.141 -w work/lab/CTF/ATT_CK_01/SecLists-master/Discovery/Web-Content/big.txt -x .php,.rar,.html,.zip -t 20 -b…

【深度学习】PyTorch框架(3):优化与初始化

1.引言 在本文中&#xff0c;我们将探讨神经网络的优化与初始化技术。随着神经网络深度的增加&#xff0c;我们会遇到多种挑战。最关键的是确保网络中梯度流动的稳定性&#xff0c;否则可能会遭遇梯度消失或梯度爆炸的问题。因此&#xff0c;我们将深入探讨以下两个核心概念&a…

【入门基础】java泛型和通配符详解

【入门基础】java泛型和通配符详解 文章目录 前言泛型类泛型方法泛型接口通配符&#xff08;Wildcards&#xff09;使用场景非主流用法 总结 前言 Java泛型&#xff08;Generics&#xff09;是JDK 5中引入的一个新特性&#xff0c;它提供了编译时类型安全检测机制&#xff0c;…

【机器学习】Cross Validation: 强化模型泛化能力的利器

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Cross Validation: 强化模型泛化能力的利器引言什么是Cross Validation&#xf…

Ubantu 使用 docker 配置 + 远程部署 + 远程开发

大家好我是苏麟 , Ubantu 一些配置 . 视频 : 服务器很贵&#xff1f;搞台虚拟机玩玩&#xff01;保姆级 Linux 远程开发教程_哔哩哔哩_bilibili Docker安装及配置 安装命令 : sudo apt install docker.io 查看版本号 : docker -v 查看虚拟机地址命令 : ifconfig 虚拟机地址 或…

pytorch的17个Loss和10个优化函数

pytorch的17个Loss和10个优化函数 一、 17个Loss 函数二、10个优化器 一、 17个Loss 函数 二、10个优化器 开始&#xff1a;

AI数字人+数字孪生IOC智慧运营平台:提升业务场景智慧化运维水平

在人工智能时代&#xff0c;“AI数字人数字孪生IOC智慧运营平台”&#xff0c;不仅能够提升数字孪生系统的人机交互体验&#xff0c;还能实现高效的运维管理&#xff0c;可以有效推动多领域场景数字化转型和智能化升级。 案例分享 深圳新一代产业园NEXT PARK交流中心 深圳新一…

coze.com收费了怎么办?这个方法让你继续免费使用!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 另辟蹊径 📒📝 替代方案📝 测试⚓️ 相关链接 ⚓️📖 介绍 📖 突如其来的变化总是让人措手不及!那个曾经免费为我们提供无限便利的coze.com,竟然也悄然迈入了收费的行列。我们精心创建的Bot,那个每天陪伴我们工作、…

第十四届蓝桥杯省赛C++C组C题【三国游戏】题解(AC)

解题思路 由于三种国家都有获胜的可能&#xff0c;所以我们需要分别枚举 X , Y , Z X,Y,Z X,Y,Z 获胜的情况。 设 X X X 获胜&#xff0c;那么对于第 i i i 个事件的贡献为 a [ i ] − ( b [ i ] c [ i ] ) a[i]-(b[i]c[i]) a[i]−(b[i]c[i])&#xff0c;根据贪心的策略…

C++写一个线程池

C写一个线程池 文章目录 C写一个线程池设计思路测试数据的实现任务类的实现线程池类的实现线程池构造函数线程池入口函数队列中取任务添加任务函数线程池终止函数 源码 之前用C语言写了一个线程池&#xff0c;详情请见&#xff1a; C语言写一个线程池 这次换成C了&#xff01;…

object-C 解答算法:合并两个有序数组(leetCode-88)

合并两个有序数组(leetCode-88) 题目如下图:(也可以到leetCode上看完整题目,题号88) 首先搞懂,什么叫“非递减顺序” 非递减顺序,是指一个序列中的元素从前往后&#xff08;或从左到右&#xff09;保持不减少或相等。 这意味着序列中的元素可以保持相同的值&#xff0c;但不会…

网络云服务1

第一章 虚拟私有云 前言 在整个ICT基础设施的发展过程中&#xff0c;网络资源一直是必不可少的存在。有了网络资源&#xff0c;设备与设备间&#xff0c;系统与系统间才有了交流&#xff0c;才能更好地去支撑企业业务的快速发展。本章将带领大家了解华为云上的网络服务。 网…

四个节点即可实现的ComfyUI批量抠图工作流

原文链接&#xff1a;ComfyUI面部修复完全指南 (chinaz.com) 下图就是批量抠图的工作流 虽然工作流很简单&#xff0c;但是我们前提还是需要安装好我们的节点 首先安装我们的抠图节点 安装 BiRefNet 所需依赖&#xff1a;timm&#xff0c;如已安装无需运行 requirements.txt…

如何写好建模论文

如何写好建模论文 一、 写好数模答卷的重要性 1.评定参赛队的成绩好坏、高低&#xff0c;获奖级别&#xff0c; 数模答卷&#xff0c; 是唯一依据。 2.答卷是竞赛活动的成绩结晶的书面形式。 3.写好答卷的训练&#xff0c;是科技写作的一种基本训练。 二、 答卷的基本内容&…

【HTML入门】第十五课 - form表单(下)表单控件们(二)

上一小节我们说了文本输入框&#xff0c;密码输入框&#xff0c;数值型输入框&#xff0c;还有大的文本域。这一小节&#xff0c;我们继续说form表单中的一些常用的控件们。 目录 1 单选按钮 2 复选框 3 下拉列表选择 1 单选按钮 单选按钮&#xff0c;就是说一组按钮中&am…