首页 > 其他分享 >代码随想录——二叉树19.最大二叉树

代码随想录——二叉树19.最大二叉树

时间:2024-11-21 15:08:41浏览次数:1  
标签:TreeNode nums 19 元素 随想录 st 二叉树 root left


image

递归

最容易想到,采用先序遍历。

1.遍历数组,找出当前区间的最大值;

2.使用该最大值作为根节点;

3.对数组的左半部分和右半部分递归调用构建最大二叉树。

这种方式是标准的 分治法,每次递归都需要遍历当前区间,找到最大值。因此,时间复杂度是 O(n^2),因为每一层递归都会遍历一遍数组,且递归的深度为 n。

一定要坚持循环不变量,这里的递归区间都选择左闭右开区间

代码

class Solution {
public:
//本题和从中序后续构造二叉树不同,本题每次递归只用使用一个数组, 所以只需要left和right
    TreeNode* buildTree(vector<int>& nums,int left,int right){//[left,right)区间
        //先序遍历 递归
        if(left >= right)return nullptr;

        //遍历找到最大值和索引
        int maxNum = -1,maxId = 0;
        for(int i = left;i<right;i++){
            if(nums[i] > maxNum){
                maxNum = nums[i];
                maxId =i;
            }
        }
        TreeNode* root = new TreeNode(maxNum);

        root->left = buildTree(nums,left,maxId);
        root->right = buildTree(nums,maxId+1,right);    

        return root;
    }

    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
	return buildTree(nums,0,nums.size());
    }
};

单调栈

单调栈是一个辅助数据结构,用来维护某些元素的顺序(例如,递增或递减顺序)。在这道题中,我们可以利用单调栈来帮助我们快速找到每个元素在构建最大二叉树时的 父子关系

为什么单调栈能够优化?

单调栈能优化这个问题的关键在于它能够快速找到每个元素的 最大值 以及该值在当前区间内的位置,而不需要每次都遍历整个区间。它通过维护一个单调栈来做到这一点,从而提高时间效率。时间复杂度O(N)

步骤:

单调栈的维护:我们从左到右扫描数组,对于每个新元素 nums[i]:

  • 如果栈顶的元素比 nums[i] 小,栈顶元素出栈,作为当前元素的左子树,直到栈顶元素比 nums[i] 大或栈为空。
  • 如果栈顶元素比nums[i]大,当前元素入栈,作为栈顶元素的右子树
  • 如果栈为空,当前元素直接入栈,更新要返回的root节点为当前元素节点(此时当前元素一定是局部的最大值)

代码

    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        // return buildTree(nums,0,nums.size());
        stack<TreeNode*> st;
        TreeNode* root = nullptr;

        for(int num:nums){
            TreeNode* node = new TreeNode(num);
            //1.如果栈非空,且栈顶值小于当前值,出栈作为左子树
            while(!st.empty() && st.top()->val < num){
                node->left = st.top();
                st.pop();
            }
            //2.如果栈非空,且栈顶值大于当前值,入栈作为右子树
            if(!st.empty()){
                st.top()->right = node;
                st.push(node);
            }else{//3.栈为空,直接入栈;
                root = node;
                st.push(node);
            }
        }

        return root;
    }

标签:TreeNode,nums,19,元素,随想录,st,二叉树,root,left
From: https://www.cnblogs.com/neromegumi/p/18560801

相关文章

  • 并查集 poj 2524,1611,1703,2236,2492,1988 练习集【蓝桥杯备赛】
    目录前言  并查集优势UbiquitousReligionspoj2524  问题描述  问题分析  代码TheSuspectspoj1611  问题描述  问题分析  代码   WirelessNetworkpoj2236  问题描述  问题分析  代码分类带权并查集合  权值树构......
  • 19、解析2_1(链、chunk、锁)
    解析sharedpool图解:librarycache里面,暂时可以认为存储着:1、SQL以及对应的执行计划(所占空间比较小);2、存储过程、函数、触发器、包,它们编译后的对象(所占空间往往比较大,特别是包所占的比较大)对于sharedpool管理和研究的时候,rowcache一般不会出现问题,所以一般情况我们都不......
  • Linux基础——ISO修复kernel-4.19.0-grub问题:/boot文件损坏
    1、挂载bc8镜像#Trobleshooting进入2、进入修复模式3、进入救援模式4、切换用户根目录/mnt/sysimagechroot/mnt/sysroot/5、挂载ios镜像数据包mkdir-p/mnt/tempmount/dev/sr0/mnt/temp可以尝试以下两种挂载镜像方式iso9660文件系统mount-oiso9660/d......
  • 24.11.19 web框架
    2.2配置环境变量2.3maven命令测试mvn-v测试maven查看版本2.4maven仓库配置配置远程仓库地址配置本地仓库2.5idea中配置maven2.6通过配置idea创建maven项目创建项目时构建系统选到maven初次创建项目时会把maven的基础依赖库(jar包)下载到本地仓......
  • 11.19鲜花&&初中OI回忆录
    我最近真是越来越喜欢写鲜花了晚自习提前跑路回家刷OI结果碰上年级主任了,被拷打了一番,还被盘问了NOIP参赛人员,尴尬好像不知不觉中,尽管实力好像没怎么增长,S组NOIP水平到能够冲击JSOI的过渡期远没有gty和zzy两名神犇来的顺畅,但是现在的我相比去年这个时候甚至今年寒假真的成长了好......
  • [RoarCTF 2019]Easy Calc
    打开是一个计算器查看网页源码发现,程序通过调用clac.php文件给num传参再计算,其中encodeURIComponent函数对计算表达式中的符号进行转码。例如表达式为1+1,则返回1%2B1,故url为calc.php?num=1%2B1。另外这里还提示我们他已经部署了waf,waf会过滤一些非法字符访问calc.php发现直接......
  • [极客大挑战 2019]BuyFlag
    点击右上角的菜单,有一个payflag,直接点击,进入到了pay.php页面发现,需要得到flag有两个要求:必须是该校的学生,密码必须正确。在该页面的网页底部,有代码提示,要求密码不能是纯数字,最后又要==404密码才正确。我们可以想到利用php的弱类型比较:只要前缀有404就好。那需要做的就是获取......
  • 代码随想录算法训练营第八天|344.反转字符串、541.反转字符串||、卡玛网54.替换数字
    344和541来自leetcode,54来自卡玛网344.反转字符串很简单的一道题,直接把数组一分为二,第一个和最后一个互换就行,直到遍历到数组一半,就结束了,从第一个往后就是s[i],最后一个往前就是s[s.lenght-i-1]。publicclassSolution{publicvoidreverseString(char[]s){......
  • [极客大挑战 2019]BabySQL
    打开页面是一个登录界面,直接用admin’or1#试试深浅回显为:这里我们分析一下这个报错,near后跟的单引号中的内容为1#'andpassword='a',那么说明sql语句就是从这里开始语法不正确的,模拟一下正常的sql应该是select*fromtablewhereusername='admin'or1#password='a'',这......
  • 数据结构在二叉树中用子问题思路来解决问题
    二叉树Oj题获取二叉树的节点数获取二叉树的终端节点个数获取k层节点的个数获取二叉树的高度检测为value的元素是否存在判断两颗树是否相同判断是否是另一棵的子树反转二叉树判断一颗二叉树是否是平衡二叉树时间复杂度O(n*n)复杂度O(N)二叉树的遍历判断是否是对称的二叉......