题目

一个数组的MaxTree定义:

  • 数组必须没有重复元素
  • MaxTree是一棵二叉树,数组的每一个值对应一个二叉树节点
  • 包括MaxTree树在内且在其中的每一棵子树上,值最大的节点都是树的头

给定一个没有重复元素的数组arr,写出生成这个数组的MaxTree的函数,要求如果数组长度为N,则时间负责度为O(N)、额外空间负责度为O(N)。

实现思路

  将数组按照大根堆进行排序
  然后直接按照大根堆进行构造一颗二叉树即可。
  使用单调栈
  通过使用单调栈,将数组中中所有数的左右比他大的数记录下来
  当某个数既无左边比他大的数,有无右边比他大的数,则该数为全局最大,将其作为二叉树的根
  然后,某数只有左比他大的数,或者右比他大的数,则该数直接挂在比他大的数的下面,
  当某个数既有左比他大的数,又有右比他大的数,则挂在两个数中较小数的下面。
  然后直接构成一棵树。
  右大值为右孩子,左大值为左孩子

代码

 void creatMaxTree(Node*& root, vector<int>v)
{//以下代码都是以数组的下角标为根据
vector<Node*>node;
vector<pair<int, int>>res;//存储每个数的左右大小的数
res.resize(v.size());
deque<int>d;//单调栈
for (int i = ; i < v.size(); ++i)
{
Node* p = new Node(v[i]);
node.push_back(p);//先生成相关的节点
while (!d.empty() && v[i] > v[d.back()])
{
int index = d.back();
d.pop_back();
if (d.empty())//有右大值,无左大值
res[index] = pair<int, int>(-, i);
else//有右大值和左大值
res[index] = pair<int, int>(d.back(), i);
}
d.push_back(i);
}
while (!d.empty())
{
int index = d.back();
d.pop_back();
if (d.empty())//即无右大值,又无左大值
res[index] = pair<int, int>(-, -);
else//无右大值有左大值
res[index] = pair<int, int>(d.back(), -);
}
for (int i = ; i < res.size(); ++i)
{
int a, b;
a = res[i].first;
b = res[i].second;
if (a == - && b == -)//即无右大值,又无左大值为根节点
root = node[i];
else if (a == - && b != -)
node[b]->rchild = node[i];
else if (a != - && b == -)
node[a]->lchild = node[i];
else if (v[a] > v[b])
node[b]->rchild = node[i];
else
node[a]->lchild = node[i];
}
}

效果

The shape of tree is:
=============================================================
v5v
v3v
^^
^^
H6H
^^
=============================================================

左神算法进阶班3_1构造数组的MaxTree的更多相关文章

  1. 左神算法进阶班8_1数组中累加和小于等于aim的最长子数组

    [题目] 给定一个数组arr,全是正数:一个整数aim,求累加和小于等于aim的,最长子数组,要求额外空间复杂度O(1),时间复杂度O(N) [题解] 使用窗口: 双指针,当sum <= aim ...

  2. 左神算法进阶班4_2累加和为aim的最长子数组

    [题目] 给定一个数组arr,和一个整数aim,求在arr中,累加和等于num的最长子数组的长度 例子: arr = { 7,3,2,1,1,7,7,7 } aim = 7 其中有很多的子数组累加和等 ...

  3. 左神算法进阶班1_5BFPRT算法

    在无序数组中找到第k大的数1)分组,每N个数一组,(一般5个一组)2)每组分别进行排序,组间不排序3)将每个组的中位数拿出来,若偶数,则拿上 / 下中位数, 成立一个一个新数组.4)新数组递归调用BF ...

  4. 左神算法进阶班1_4Manacher算法

    #include <iostream> #include <string> using namespace std; //使用manacher算法寻找字符中最长的回文子串 in ...

  5. 左神算法进阶班5_4设计可以变更的缓存结构(LRU)

    [题目] 设计一种缓存结构,该结构在构造时确定大小,假设大小为K,并有两个功能: set(key, value):将记录(key, value)插入该结构. get(key):返回key对应的valu ...

  6. 左神算法进阶班1_1添加最少字符得到原字符N次

    Problem: 给定一个字符串str1,只能往str1的后面添加字符变成str2. 要求1:str2必须包含两个str1,两个str1可以有重合,但是不能以同一个位置开头. 要求2:str2尽量短最 ...

  7. 左神算法进阶班6_1LFU缓存实现

    [题目] LFU也是一个著名的缓存算法,自行了解之后实现LFU中的set 和 get 要求:两个方法的时间复杂度都为O(1) [题解] LFU算法与LRU算法很像 但LRU是最新使用的排在使用频率最前 ...

  8. 左神算法基础班4_1&2实现二叉树的先序、中序、后序遍历,包括递归方式和非递归

    Problem: 实现二叉树的先序.中序.后序遍历,包括递归方式和非递归方式 Solution: 切记递归规则: 先遍历根节点,然后是左孩子,右孩子, 根据不同的打印位置来确定中序.前序.后续遍历. ...

  9. 左神算法基础班5_1设计RandomPool结构

    Problem: 设计RandomPool结构 [题目] 设计一种结构,在该结构中有如下三个功能: insert(key):将某个key加入到该结构,做到不重复加入. delete(key):将原本在 ...

随机推荐

  1. Windows XP浏览器支持度

    XP最多支持到IE8 谷歌已经结束对Windows XP版Chrome浏览器的支持. 2015年11月,谷歌表示会在2015年结束后,结束对Windows XP版Chrome浏览器的支持.而今,随着2 ...

  2. Docker学习のDocker和虚拟机

    最初听到Docker,是作为虚拟机来宣传的,但是它本质不是虚拟机 一.虚拟机 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统. ...

  3. Flutter 打包报错 : Unknown FLUTTER_BUILD_MODE: xxx

    概要 在集成flutter 工程之后,我们的工程在debug 和release 模式下都没什么问题,一切都很顺利.但是我们在打企业包的时候却出现了错误: Showing Recent Errors O ...

  4. linux 将子文件夹的文件复制到 当前目录中

    linux 将子文件夹的文件复制到 当前目录中,如 目录结构大概是 -sh |__ db_backup |___ test |____ 2018_01_01_00_00_00 |_____ 2018_ ...

  5. CF850E Random Elections

    题意:一共有n个人,要在三个人中选prefer,一开始他们心中都会想好他们的排名(共6种),之后给出的判断不会矛盾.规则如下:一共有三轮,分别是a->b,b->c,c->a,每个人选 ...

  6. 重磅发布: 阿里云WAF日志实时分析上线 (含视频)

    摘要: 阿里云WAF与日志服务打通,对外开发Web访问与攻击日志.提供近实时的网站具体的日志自动采集存储.并提供基于日志服务的查询分析.报表报警.下游计算对接与投递的能力. 背景 Web攻击形势 互联 ...

  7. 思维题+栈的应用——cf1092D有意思

    第一例很简单,把两个差为偶数的列不断合并即可 这种不需要撤销的合并相连数直接用栈来做 /* 如果相邻两列高度差为偶数 那么可以直接消去 */ #include<bits/stdc++.h> ...

  8. memcpy函数实现中的优化

    今天浏览Google面试题的时候,有看到一个memcpy的实现,以及如何去优化memcpy. 我对memcpy的实现的记忆就是,拷贝的时候需要从后往前拷贝,为何防止内存重叠. 但是如果去优化它我没有想 ...

  9. C++函数调用原理理解

    空程序: int main() { 00411360  push        ebp       ;压入ebp 00411361  mov         ebp,esp     ;ebp = es ...

  10. 杂项-日志:日志(log)

    ylbtech-杂项-日志:日志(log) 1.返回顶部 1. 概述 网络设备.系统及服务程序等,在运作时都会产生一个叫log的事件记录:每一行日志都记载着日期.时间.使用者及动作等相关操作的描述. ...