博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
左神算法进阶班3_1构造数组的MaxTree
阅读量:6943 次
发布时间:2019-06-27

本文共 2177 字,大约阅读时间需要 7 分钟。

题目

一个数组的MaxTree定义:

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

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

实现思路

  将数组按照大根堆进行排序

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

代码

1 void creatMaxTree(Node*& root, vector
v) 2 {
//以下代码都是以数组的下角标为根据 3 vector
node; 4 vector
>res;//存储每个数的左右大小的数 5 res.resize(v.size()); 6 deque
d;//单调栈 7 for (int i = 0; i < v.size(); ++i) 8 { 9 Node* p = new Node(v[i]);10 node.push_back(p);//先生成相关的节点11 while (!d.empty() && v[i] > v[d.back()])12 {13 int index = d.back();14 d.pop_back();15 if (d.empty())//有右大值,无左大值16 res[index] = pair
(-1, i);17 else//有右大值和左大值18 res[index] = pair
(d.back(), i);19 }20 d.push_back(i);21 }22 while (!d.empty())23 {24 int index = d.back();25 d.pop_back();26 if (d.empty())//即无右大值,又无左大值27 res[index] = pair
(-1, -1);28 else//无右大值有左大值29 res[index] = pair
(d.back(), -1);30 }31 for (int i = 0; i < res.size(); ++i)32 {33 int a, b;34 a = res[i].first;35 b = res[i].second;36 if (a == -1 && b == -1)//即无右大值,又无左大值为根节点37 root = node[i];38 else if (a == -1 && b != -1)39 node[b]->rchild = node[i];40 else if (a != -1 && b == -1)41 node[a]->lchild = node[i];42 else if (v[a] > v[b])43 node[b]->rchild = node[i];44 else45 node[a]->lchild = node[i];46 } 47 }

效果

The shape of tree is:=============================================================                          v5v                                                            v3v                                           ^4^                                                            ^2^         H6H                          ^1^=============================================================

 

转载于:https://www.cnblogs.com/zzw1024/p/11052016.html

你可能感兴趣的文章
保卫萝卜官方PC版——含绿色版 V1.0.6Beta
查看>>
聚合类新闻client产品功能点详情分析
查看>>
突袭HTML5之WebSocket入门5 - 包管理工具npm
查看>>
HDU-4255 A Famous Grid BFS
查看>>
每日英语:Everything You Think You Know About China Is Wrong
查看>>
带线的无限级下拉树列表-完整示例篇
查看>>
Clipboard with Custom Clipboard Formats - Delphi
查看>>
[Step By Step]SAP HANA PAL 异态检测算法Anomaly Detection实现例程ANOMALYDETECTION
查看>>
linux上配置boost手记
查看>>
IIS状态监测(如果状态错误则重启IIS)
查看>>
PostgreSQL中,database,schema,table之间关系
查看>>
12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球(13个呢?)...
查看>>
HDU 2364 (记忆化BFS搜索)
查看>>
两个实用的方法从Base64字符串生成RSAPublicKey及RSAPrivatekey
查看>>
常用验证数字的正则表达式
查看>>
kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)[收藏]
查看>>
java读取excel文件数据
查看>>
Java的RMI远程方法调用实现和应用
查看>>
Linux 上使用 Gmail SMTP 服务器发送邮件通知
查看>>
Dell vsotro 14 3000系列从win10重装win7
查看>>