654、最大二叉树

news2024/11/29 10:47:56

1、题目描述

. - 力扣(LeetCode)

其实就是给定了一个所谓"最大二叉树"的规则,让我们去构建二叉树。

以 nums = [3,2,1,6,0,5] 为例,规则如下:

(1)找出其中的最大值6将其作为根节点,6前面的是左子树、6后面的是右子树。

(2)左子树数组为[3,2,1]按照同样的规则,其中最大的是3作为左子树的根节点、前面构建左子树的左子树、后面构建左子树的右子树。

(3)以此类推即可。

2、分析

    构造二叉树类的题目看起来都差不多。
    遍历顺序:凡是构造二叉树类的题目我们都要用前序遍历(中左右)。
    —— 先构造根节点然后递归的构造左右子树。

    (1)递归函数的样式如下。返回值返回的是TreeNode*、入参是数组。
    TreeNode* buildTrree(vector<int>& nums)
    (2)递归函数内部首先就是退出条件。
    无非是数组为空(空节点)或数组只能构造一个节点(叶子节点)。
    (3)接下来就是明确根节点的值并构造根节点。
    (4)根节点构造完毕后就是获取构造左右子树的素材数组
    (5)然后就是递归的构造左右子树,并将结果直接返回给当前根节点。
    root->left = buildTree();
    root->left = buildTree();

class Solution {
public:
    //1.首先明确函数的入参及返回值
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        //2.函数内首先确定退出条件(nums长度为0返回空、nums长度为1返回目标节点)
        if(nums.size() == 0) return NULL;
        if(nums.size() == 1) return new TreeNode(nums[0]);
        //3.找出最大值构建根节点,然后递归的构建左右子树
        //3.1.找出最大值并构建根节点
        int max_index = 0, max_num = nums[0];
        for(int i = 1; i < nums.size(); i++){
            if(nums[i] > max_num){
                max_index = i;
                max_num = nums[i];
            }
        }
        TreeNode* root = new TreeNode(nums[max_index]);
        //3.2.构建左、右子树的数组lnums、rnums
        vector<int> lnums(nums.begin(), nums.begin()+max_index);
        vector<int> rnums(nums.begin()+max_index+1, nums.end());
        //3.3.递归地构建左右子树
        root->left = constructMaximumBinaryTree(lnums);
        root->right = constructMaximumBinaryTree(rnums);
        return root;
    }
    void levelorder(TreeNode* root){
        queue<TreeNode*> que;
        que.push(root);
        while(!que.empty()){
            int level_size = que.size();
            for(int i = 0; i < level_size; i++){
                TreeNode* tmp = que.front();
                cout << tmp->val << ",";
                que.pop();
                if(tmp->left) que.push(tmp->left);
                if(tmp->right) que.push(tmp->right);
            }
            cout << endl;
        }
    }
};

3、实现代码

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <math.h>

using namespace std;


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:
    //1.首先明确函数的入参及返回值
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        //2.函数内首先确定退出条件(nums长度为0返回空、nums长度为1返回目标节点)
        if(nums.size() == 0) return NULL;
        if(nums.size() == 1) return new TreeNode(nums[0]);
        //3.找出最大值构建根节点,然后递归的构建左右子树
        //3.1.找出最大值并构建根节点
        int max_index = 0, max_num = nums[0];
        for(int i = 1; i < nums.size(); i++){
            if(nums[i] > max_num){
                max_index = i;
                max_num = nums[i];
            }
        }
        TreeNode* root = new TreeNode(nums[max_index]);
        //3.2.构建左、右子树的数组lnums、rnums
        vector<int> lnums(nums.begin(), nums.begin()+max_index);
        vector<int> rnums(nums.begin()+max_index+1, nums.end());
        //3.3.递归地构建左右子树
        root->left = constructMaximumBinaryTree(lnums);
        root->right = constructMaximumBinaryTree(rnums);
        return root;
    }
    void levelorder(TreeNode* root){
        queue<TreeNode*> que;
        que.push(root);
        while(!que.empty()){
            int level_size = que.size();
            for(int i = 0; i < level_size; i++){
                TreeNode* tmp = que.front();
                cout << tmp->val << ",";
                que.pop();
                if(tmp->left) que.push(tmp->left);
                if(tmp->right) que.push(tmp->right);
            }
            cout << endl;
        }
    }
};


int main()
{
    Solution s1;
    vector<int> nums{3,2,1,6,0,5};
    TreeNode* root = s1.constructMaximumBinaryTree(nums);
    s1.levelorder(root);

}

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

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

相关文章

自动驾驶系列—线控系统:驱动自动驾驶的核心技术解读与应用指南

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

工具 | 红队大佬亲测5款推荐的Burpsuite插件

*免责声明&#xff1a;* *本文章仅用于信息安全技术分享&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作…

基于SpringBoot+Vue+MySQL的校园二手物品交易系统

系统展示 用户前台界面 管理员后台界面 系统背景 校园二手物品交易系统开发的背景与重要性随着高等教育的蓬勃发展&#xff0c;大学生群体的规模持续扩大&#xff0c;随之而来的是物品更新换代速度的显著加快。学生们在追求新潮、高品质生活的同时&#xff0c;往往会产生大量闲…

微信步数C++

题目&#xff1a; 样例解释&#xff1a; 【样例 #1 解释】 从 (1,1) 出发将走 2 步&#xff0c;从 (1,2) 出发将走 4 步&#xff0c;从 (1,3) 出发将走 4 步。 从 (2,1) 出发将走 2 步&#xff0c;从 (2,2) 出发将走 3 步&#xff0c;从 (2,3) 出发将走 3 步。 从 (3,1) 出发将…

llm接口高可用工程实践(尽快关注我,以后这些文章将只对粉丝开放)

上一节课程链接&#xff1a;中文llama3仿openai api实战-CSDN博客 &#xff0c;本文是在上一节基础上继续操作 课程介绍 本文基于Chinese-LLaMA-Alpaca-3&#xff08;https://github.com/ymcui/Chinese-LLaMA-Alpaca-3&#xff09;项目&#xff0c;介绍如何通过搭建2个llama3…

生信初学者教程(二十五):验证候选特征

文章目录 介绍加载R包导入数据函数重要特征的表达ROC分析汇总筛选结果输出结果总结介绍 在成功识别出核心特征之后,为了验证这些特征的有效性和可靠性,我们在发现数据集和验证数据集上进行了进一步的评估。这一步骤旨在确保这些特征在不同数据集上的表达值具有一致性,并验证…

大模型时代下小模型知多少?从模型结构、预训练数据到运行时成本分析总结

今天&#xff0c;我们来谈谈小模型。《Small Language Models综述&#xff0c;Small Language Models: Survey, Measurements, and Insights》&#xff1a;https://arxiv.org/pdf/2409.15790这个工作&#xff0c;会有一些启发。 本文主要介绍三个话题&#xff0c;一个是小模型…

【笔记】信度检验

一、信度 信度是指测量结果的一致性和稳定性。 1.一致性&#xff08;Consistency&#xff09; 一致性指的是测量工具内部各个部分或项目之间的协调一致程度。高一致性意味着测量工具的不同部分都在测量同一个概念或特质。 例子&#xff1a;智力测试 假设我们有一个包含100…

成为AI产品经理,应该具备哪些条件?

开篇勘误标题&#xff1a;未来不会有AI产品经理这个岗位&#xff0c;就像没有移动产品经理一样。 如果你是个产品经理&#xff0c;但是不懂移动端的产品交互和设计&#xff0c;那你就只能在自己的头衔前面加上一个“PC”&#xff1a;PC产品经理&#xff0c;代表你的细分或者不…

在线Html到Markdown转换器

具体请前往&#xff1a;在线Html转Markdown

6个最受欢迎的大模型本地运行工具

运行大型语言模型 (LLM)&#xff08;如 ChatGPT 和 Claude&#xff09;通常涉及将数据发送到 OpenAI 和其他 AI 模型提供商管理的服务器。虽然这些服务是安全的&#xff0c;但一些企业更愿意将数据完全离线&#xff0c;以保护更大的隐私。 本文介绍了开发人员可以用来在本地运…

Java 枚举一口气讲完!(´▽`ʃ♡ƪ)

Java 枚举类型 Java面向对象设计 - Java枚举类型 什么是枚举类型&#xff1f; 枚举类型创建常量的有序列表作为类型。它以特定顺序指定常量。 在枚举类型中定义的常量是该枚举类型的实例。 语法 使用关键字enum使用以下语法定义枚举类型&#xff1a; <access-modifie…

Vue基础指令用法

vue2&#xff0c;官网&#xff1a;介绍 — Vue.js (vuejs.org) 例子&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…

【SpringBoot】基础+JSR303数据校验

目录 一、Spring Boot概要 1. SpringBoot介绍 2. SpringBoot优点 3. SpringBoot缺点 4. 时代背景-微服务 二、Spring Boot 核心配置 1. Spring Boot配置文件分类 1.1 application.properties 1.2 application.yml 1.3 小结 2. YAML概述 3. YAML基础语法 3.1 注意事…

生信初学者教程(二十六):特征和免疫浸润的关联分析

文章目录 介绍加载R包导入数据函数重要特征与免疫细胞的相关热图SLC6A8关联图SLC6A8与特定免疫细胞SLC6A8与其他免疫细胞输出结果总结介绍 在成功获取核心特征集之后,我们计划深入地探究这些特征与免疫浸润细胞之间的关联性,这是因为免疫浸润细胞在癌症的进程中扮演着至关重要…

成都睿明智科技有限公司抖音电商新蓝海的领航者

在当今这个数字化浪潮汹涌的时代&#xff0c;电商行业正以惊人的速度迭代升级&#xff0c;而抖音电商作为新兴势力&#xff0c;更是凭借其庞大的用户基数、精准的算法推荐和高度互动的社区氛围&#xff0c;成为了众多商家竞相追逐的蓝海市场。在这片充满机遇与挑战的海洋中&…

关于Excel将列号由字母改为数字

将Excel的列表由字母改为数字 步骤&#xff1a; 文件-选项-公式-勾选“使用公式”中的“R1C1引用样式(R)”-确定即可 部分步骤图示 设置前的样子 设置后的样子 虽然现在还不清楚在xlwings操作Excel时有什么作用&#xff0c;先留着吧。

内网靶场 | 渗透攻击红队内网域渗透靶场-1(Metasploit)零基础入门到精通,收藏这一篇就够了

“ 和昨天的文章同一套靶场&#xff0c;这次主要使用的是Kali Linux以及Metasploit来打靶场&#xff0c;熟悉一下MSF在内网渗透中的使用&#xff0c;仅供学习参考&#xff0c;大佬勿喷。本期文章靶场来自公众号&#xff1a;渗透攻击红队。” 靶场下载地址&#xff1a;https://…

SpringBoot框架在在线教育系统中的应用

3系统分析 3.1可行性分析 通过对本微服务在线教育系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本微服务在线教育系统采用SSM框架&#xff0c;JAVA作为开…

微调大语言模型——超详细步骤

微调一个语言模型&#xff0c;其实就是在一个已经训练过的模型上&#xff0c;继续用新数据进行训练&#xff0c;帮助模型更好地理解和处理这个新的任务。可以把这个过程想象成教一个已经懂很多道理的人去解决新的问题。 这个过程可以分为五个简单的步骤&#xff1a; 加载预训练…