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

news2024/9/21 16:39:33

前言

二叉树篇,继续。
记录 五十一【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;
        }
        //找最大值确定根节点,同时确定最大值的下标index
        int 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;//因为题目中说元素值最小是0
            int 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://www.coloradmin.cn/o/1935706.html

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

相关文章

【Linux】安装PHP扩展-Swoole

说明 本文档是在centos7.6的环境下&#xff0c;安装PHP7.4之后&#xff0c;安装对应的PHP扩展Swoole。 一、swoole简述 Swoole 是一个为 PHP 设计的高性能的异步并行网络通信引擎&#xff0c;它以扩展&#xff08;extension&#xff09;的形式存在&#xff0c;极大地提升了 …

Linux--YUM仓库部署及NFS共享存储

目录 一、YUM仓库服务 1.1 YUM介绍 1.2 yum 常用的命令 1.3 YUM 源的提供方式 1.3.1 配置本地 yum 源仓库 1.3.2 配置 ftp 源 1.3.3 配置http服务源 二、NFS 共享存储 2.1 NFS基本概述 2.2 为什么使用 NFS 共享存储 2.3 NFS 应用场景 2.4 NFS 实现原理 2.5 NFS文件…

【python学习】爬虫中常使用的urllib和requests库的的背景、定义、特点、功能、代码示例以及两者的区别

引言 urllib是Python标准库中的一个模块&#xff0c;它提供了一系列用于操作URL的功能 requests是一个Python第三方库&#xff0c;由Kenneth Reitz创建&#xff0c;用于简化HTTP客户端的编程 一、urllib的定义 urllib可以操作url&#xff0c;主要分为以下几个子模块&#xff1…

Nginx详解(超级详细)

目录 Nginx简介 1. 为什么使用Nginx 2. 安装Nginx Nginx的核心功能 1. Nginx反向代理功能 2. Nginx的负载均衡 3 Nginx动静分离 Nginx简介 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;在BSD-like 协…

深入Redis集群部署:从安装配置到测试验证的完整指南

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…

FastAPI 学习之路(六十)打造系统的日志输出

我们要搭建日志系统&#xff0c;可以使用loguru&#xff0c;很不错的一个开源日志系统 pip install loguru 我们在common创建log.py&#xff0c;使用方式也很简单 import os import timefrom loguru import logger# 日志的路径 log_path os.path.join(os.getcwd(), "log…

信息安全工程师题

物理隔离技术要求两台物理机物理上并不直连&#xff0c;只能进行间接的信息交换。所以防火墙不能实现网络的物理隔离Web应用防火墙可以防止SQL注入、xss攻击、恶意文件上传、远程命令执行、文件包含、恶意扫描拦截等&#xff1b;可以发现并拦截恶意的Web代码&#xff1b;可防止…

树形背包问题

一些题目给定了树形结构&#xff0c;在这个树形结构中选取一定数量的点或边&#xff08;也可能是其他属性&#xff09;&#xff0c;使得某种与点权或者边权相关的花费最大或者最小。解决这类问题&#xff0c;一般要考虑使用树上背包。 树上背包&#xff0c;顾名思义&#xff0c…

JDK垃圾回收机制和垃圾回收算法

查看java相关信息 java -XX:PrintCommandLineFlags -version UseParallelGC 即 Parallel Scavenge Parallel Old,再查看详细信息 内存分配策略 1. 对象优先在 Eden 分配 大多数情况下&#xff0c;对象在新生代 Eden 区分配&#xff0c;当 Eden 区空间不够时&#xff0c;发…

STM32被拔网线 LWIP的TCP无法重连解决方案

目录 一、问题描述 二、项目构成 三、问题解决 1.问题代码 2.解决思路 3.核心代码&#xff1a; 四、完整代码 1.监测网口插入拔出任务 2.TCP任务 3.创建tcp任务 4.删除tcp任务 五、总结 一、问题描述 最近遇到一个问题&#xff0c;就是我的stm32设备作为tcp客户端…

c# listview控件调整标题显示顺序

右键点击listview,选择编辑列 修改DisplayIndex listview在成员位置点击上下箭头移动后&#xff0c;实际显示不会改变&#xff0c;因为DisplayIndex没有改变

Python 工程师对 3D 高斯溅射的介绍(第 1 部分)

从 Python 工程师的角度理解和编写 Gaussian Splatting 欢迎来到雲闪世界。2023 年初&#xff0c;来自法国蔚蓝海岸大学和马克斯普朗克信息研究所的作者发表了一篇题为“用于实时场渲染的 3D 高斯溅射”的论文。 该论文展示了实时神经渲染的重大进步&#xff0c;超越了 NeRF 等…

一文吃透,低代码是什么?盘点国内十大低代码平台,你用过哪个?

什么是低代码(Low Code)&#xff1f;低代码是怎么火的&#xff1f;国内十大低代码平台分别是谁&#xff1f;低代码项目开发流程是怎样的&#xff1f;低代码和无代码区别是啥&#xff1f;以及低代码的核心价值是什么&#xff1f;可以使用低代码开发平台创建哪些应用&#xff1f;…

el-cascader数据回显失败

el-cascader选中数据第一次回显正常&#xff0c;当选中数据改变再次回显时失败&#xff0c;呈现的还是上次的选中数据 如图 常用的方法this. n e x t T i c k ( ( ) > ) 跟 t h i s . nextTick(() > {})跟this. nextTick(()>)跟this.forceUpdate();强制刷新数据都无…

leetcode hot100_part30_二分查找

上次写博客已经一个月了&#xff0c;这段时间在做外卖项目&#xff0c;真的啥也没有就是个小玩具。 上次接触是在最长递增子序列的一个题解里&#xff0c;复习一下已经忘完了。如果我们在一个有序数组中进行查找某个target&#xff0c;一般肯定就是从小到大or从大到小遍历查找&…

js reduce 的别样用法

let mergedItems list.reduce((accumulator, currentItem) > {let existingItem accumulator.find((item) > item.manObject_name currentItem.manObject_name);if (existingItem) {existingItem.laborCostHand currentItem.laborCostHand; //劳务费existingItem.wor…

【网络】Socket编程

文章目录 正确理解端口号理解源IP地址和目的IP地址认识端口号端口号和进程ID 理解Socket网络字节序socket编程接口创建socket套接字bind绑定套接字listen建立监听accept接受连接connect建立连接sendto发送数据接收数据close关闭套接字 sockaddr结构体 正确理解端口号 理解源IP…

Windows 电脑部署 ollama3 并安装模型

Windows 电脑部署 ollama3 并安装模型 部署中为了尽可能减少对本地环境的污染&#xff0c;使用 Docker 安装&#xff01; github: https://github.com/ollama/ollama 准备部署文件 version: 3.8services:ollama:volumes:- ./models:/root/.ollama # 将本地文件夹挂载到容器中…

独立游戏《星尘异变》UE5 C++程序开发日志7——实现加载界面

目录 一、创建自定义AssetManager类 二、异步加载资产 三、加载界面UI的实现 1.UI布局 2.在打开关卡前和进入关卡后创建UI并统计进度 有时可能会遇到关卡已经进去但依然会卡顿一段时间的情况&#xff0c;所以我们需要在进入关卡后&#xff0c;玩家可以操作关卡之前&#x…

RAG技术进化史:从初级到高级,再到模块化RAG架构的创新发展

大型语言模型&#xff08;LLMs&#xff09;通过在自然语言任务及其它领域的成功应用&#xff0c;如 ChatGPT、Bard、Claude 等所示&#xff0c;已经彻底改变了 AI 领域。这些 LLMs 能够生成从创意写作到复杂代码的文本。然而&#xff0c;LLMs 面临着幻觉、过时知识和不透明、无…