654、最大二叉树

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、rnumsvector<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、rnumsvector<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.xdnf.cn/news/1555755.html

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

相关文章

程序传入单片机的过程,以Avrdude为例分析

在市场上有各式各样的单片机&#xff0c;例如Arduino&#xff0c;51单片机&#xff0c;STM等。通常&#xff0c;我们都用其对应的IDE软件进行单片机的编程。这些软件既负责将程序代码转写成二进制代码&#xff0c;即机器语言&#xff0c;也负责将该二进制代码导入单片机。与此同…

C++ 算法学习——7.4.1 优化算法——双指针

双指针法&#xff08;Two Pointers&#xff09;是一种常用的算法技巧&#xff0c;通常用于解决数组或链表中的问题。这种技巧通过维护两个指针&#xff0c;通常分别指向数组或链表的不同位置&#xff0c;来协同解决问题。双指针法一般有两种类型&#xff1a;快慢指针和左右指针…

什么是transformer大模型,答案就在这里

Transformer大模型是一种在自然语言处理&#xff08;NLP&#xff09;领域中广泛使用的模型&#xff0c;其详细数据与分析可以从以下几个方面进行阐述&#xff1a; 1. 模型架构 Transformer模型本质上是一个Encoder-Decoder架构。编码组件由多层编码器&#xff08;Encoder&…

(笔记)第三期书生·浦语大模型实战营(十一卷王场)–书生基础岛第3关---浦语提示词工程实践

学员闯关手册&#xff1a;https://aicarrier.feishu.cn/wiki/ZcgkwqteZi9s4ZkYr0Gcayg1n1g?open_in_browsertrue 课程视频&#xff1a;https://www.bilibili.com/video/BV1cU411S7iV/ 课程文档&#xff1a; https://github.com/InternLM/Tutorial/tree/camp3/docs/L1/Prompt 关…

还在“卷”长度?长文本模型真的基于上下文进行回复吗?

近年来&#xff0c;随着长文本模型&#xff08;Long-context Model, LCM&#xff09;技术的突飞猛进&#xff0c;处理长上下文的能力已成为各大语言模型&#xff08;Large Language Model, LLM&#xff09;的核心竞争力&#xff0c;也是各大技术厂商争夺的焦点。截至2023年12月…

RAG再总结之如何使大模型更好使用外部数据:四个不同层级及查询-文档对齐策略

我们来看看RAG进展。《Retrieval Augmented Generation (RAG) and Beyond: A Comprehensive Survey on How to Make your LLMs use External Data More Wisely》(https://arxiv.org/abs/2409.14924)&#xff0c;主要讨论了如何使大型语言模型&#xff08;LLMs&#xff09;更明智…

Redis中BitMap实现签到与统计连续签到功能

服务层代码 //签到Overridepublic Result sign() {//1.获取当前登录的用户Long userId UserHolder.getUser().getId();//获取日期LocalDateTime now LocalDateTime.now();//拼接keyString keySuffix now.format(DateTimeFormatter.ofPattern(":yyyyMM"));String …

实例分割、语义分割和 SAM(Segment Anything Model)

实例分割、语义分割和 SAM&#xff08;Segment Anything Model&#xff09; 都是图像处理中的重要技术&#xff0c;它们的目标是通过分割图像中的不同对象或区域来帮助识别和分析图像&#xff0c;但它们的工作方式和适用场景各有不同。 1. 语义分割&#xff08;Semantic Segme…

一款基于 Java 的可视化 HTTP API 接口快速开发框架,干掉 CRUD,效率爆炸(带私活源码)

平常我们经常需要编写 API&#xff0c;但其实常常只是一些简单的增删改查&#xff0c;写这些代码非常枯燥无趣。 今天给大家带来的是一款基于 Java 的可视化 HTTP API 接口快速开发框架&#xff0c;通过 UI 界面编写接口&#xff0c;无需定义 Controller、Service、Dao 等 Jav…

Bolt.new:终极自动化编程工具

兄弟们&#xff0c;终极写代码工具来了—— Bolt.new&#xff01;全方位的编程支持&#xff1a; StackBlitz 推出了 Bolt․new&#xff0c;这是一款结合了 AI 与 WebContainers 技术的强大开发平台&#xff0c;允许用户快速搭建并开发各种类型的全栈应用。 它的主要特点是无需…

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

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

展锐平台WIFI国家码信道总结

展锐平台WIFI国家码信道总结 1.下载wireless-regdb wireless-regdb是一个开源的工程,编译它会生成regulatory.bin文件,这实际上是一个加密后的数据库,它记录各个国家可用的无线频段。 可从下面的网站上下载最新的regdb库: https://git.kernel.org/pub/scm/linux/kernel…

【无人水面艇路径跟随控制2】(C++)USV代码阅读: SetOfLos 类的从路径点和里程计信息中计算期望航向

【无人水面艇路径跟随控制2】&#xff08;C&#xff09;USV代码阅读&#xff1a; SetOfLos 类的从路径点和里程计信息中计算期望航向 写在最前面set_of_los.cpp小结详细解释头文件包含命名空间构造函数和析构函数设置参数函数获取航向函数 &#x1f308;你好呀&#xff01;我是…

热门:AI变现,看看谁在默默赚大钱?

在这个愈发依赖AI的时代&#xff0c;找到属于自己的盈利方式愈发重要。 更多实操教程和AI绘画工具,可以扫描下方,免费获取 总的来说&#xff0c;利用AI进行盈利的方式主要有三种&#xff1a;技术型、流量型和内容型。 每种方式都根植于AI的特性&#xff0c;但同时也需要特定…

重庆数字孪生工业互联网可视化技术,赋能新型工业化智能制造工厂

重庆作为西南地区的重要工业基地&#xff0c;正积极探索和实践数字孪生、工业互联网及可视化技术在智能制造领域的深度融合&#xff0c;致力于打造新型工业化智能制造工厂&#xff0c;为制造业的高质量发展注入强劲动力。 在重庆的智能制造工厂中&#xff0c;数字孪生技术被广…

Pytorch基础:网络层

文章目录 1.卷积层-Convolution Layers1.1 1d/2d/3d卷积1.2卷积--nn.Conv2d1.3转置卷积(实现上采样) 2.池化层3.线性层—Linear Layer4.激活函数层—Activate Layer 1.卷积层-Convolution Layers 卷积运算:卷积运算在输入信号(图像)上滑动,相应位置上进行乘加. 卷积核:又称过滤…

感知机及其实践

说明 感知机是SVM(support vector machine,支持向量机)的基础&#xff0c;更是机器学习的基础。本文的目的在于把感知机的相关概念捋清楚&#xff0c;并基于感知机做最基本的线性可分的二分类实践。 有关机器学习的一些基础概念&#xff0c;读者可以参考本专栏的第一篇博文[4]&…

AI大模型有哪些,收藏起来防踩坑

大模型是指具有数千万甚至数亿参数的深度学习模型&#xff0c;通常由深度神经网络构建而成&#xff0c;拥有数十亿甚至数千亿个参数。大模型的设计目的是为了提高模型的表达能力和预测性能&#xff0c;能够处理更加复杂的任务和数据。以下是对大模型的详细数据与分析&#xff1…

【AI副业项目】揭密AI技术对于儿童古诗文项目的应用

大家都知道&#xff0c;古诗文作为中华文化的瑰宝&#xff0c;承载着丰富的历史情感和智慧。但是&#xff0c;在现代社会快节奏的生活中&#xff0c;如何让更多人尤其是少年儿童感受到古诗文的魅力&#xff0c;成为了一个极需解决的问题。 AI技术的兴起为这一难题提供了新的解…

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…