左神算法进阶班3_1构造数组的MaxTree 缺乏、安全感 2022-10-02 15:55 87阅读 0赞 ## 题目 ## 一个数组的MaxTree定义: * 数组必须没有重复元素 * MaxTree是一棵二叉树,数组的每一个值对应一个二叉树节点 * 包括MaxTree树在内且在其中的每一棵子树上,值最大的节点都是树的头 给定一个没有重复元素的数组arr,写出生成这个数组的MaxTree的函数,要求如果数组长度为N,则时间负责度为O(N)、额外空间负责度为O(N)。 ## 实现思路 ## 将数组按照大根堆进行排序 然后直接按照大根堆进行构造一颗二叉树即可。 使用单调栈 通过使用单调栈,将数组中中所有数的左右比他大的数记录下来 当某个数既无左边比他大的数,有无右边比他大的数,则该数为全局最大,将其作为二叉树的根 然后,某数只有左比他大的数,或者右比他大的数,则该数直接挂在比他大的数的下面, 当某个数既有左比他大的数,又有右比他大的数,则挂在两个数中较小数的下面。 然后直接构成一棵树。 右大值为右孩子,左大值为左孩子 ## 代码 ## 1 void creatMaxTree(Node*& root, vector<int>v) 2 { //以下代码都是以数组的下角标为根据 3 vector<Node*>node; 4 vector<pair<int, int>>res;//存储每个数的左右大小的数 5 res.resize(v.size()); 6 deque<int>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<int, int>(-1, i); 17 else//有右大值和左大值 18 res[index] = pair<int, int>(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<int, int>(-1, -1); 28 else//无右大值有左大值 29 res[index] = pair<int, int>(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 else 45 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
相关 数组的进阶 目录 引入 1.多维数组及其操作 1.1二维数组的概念 1.2二维数组的操作 -------------------- 引入 上一篇博客相信已经带领各位对数组 末蓝、/ 2023年09月26日 22:09/ 0 赞/ 97 阅读
相关 左神算法进阶班3_4网易题——烽火传递 【题目】 一个数组中的数字组成环形山,数值为山高 1 2 4 5 3 规则,烽火传递: 相邻之间的两座山必能看到烽火, 非相邻的山之间有一边的山高都 <= Bertha 。/ 2022年10月02日 15:55/ 0 赞/ 117 阅读
相关 左神算法进阶班3_1构造数组的MaxTree 题目 一个数组的MaxTree定义: 数组必须没有重复元素 MaxTree是一棵二叉树,数组的每一个值对应一个二叉树节点 包括MaxTree树在内且在 缺乏、安全感/ 2022年10月02日 15:55/ 0 赞/ 88 阅读
相关 左神算法:加强堆的实现(Java) 为什么要有加强堆? Java中的PriorityQueue(优先级队列)就是系统提供的堆实现,那么为什么还要手动去实现? 假如现在你手里有一个堆,里面存着一些元素,用户 小鱼儿/ 2022年09月06日 00:18/ 0 赞/ 129 阅读
相关 栈和队列——构造数组的MaxTree(java实现) 【题目】 定义二叉树节点如下: class Node{ public int value; public Node left; 亦凉/ 2022年06月07日 00:41/ 0 赞/ 92 阅读
相关 【搞定左神算法初级班】第7节:暴力递归、动态规划 目 录: 一、递归 题目1:求 n! 的结果 题目2:汉诺塔问题 题目3:打印一个字符串的全部子序列,包括空字符串 题目4:打印一个字符串的全部排列 题目5:母 冷不防/ 2022年04月23日 15:20/ 0 赞/ 240 阅读
相关 【搞定左神算法初级班】第6节:前缀树、贪心算法 目 录: 一、前缀树:Prefix Tree 1.1 前缀树题目举例:一个字符串类型的数组 arr1,另一个字符串类型的数组 arr2 1.2 前缀树的 insert 以你之姓@/ 2022年02月26日 13:20/ 0 赞/ 183 阅读
相关 左神算法进阶班1_4Manacher算法 1 include <iostream> 2 include <string> 3 4 using namespace std; 朴灿烈づ我的快乐病毒、/ 2022年01月06日 00:01/ 0 赞/ 163 阅读
相关 左神算法进阶班3_2求最大矩阵 【题目】 给定一个整型矩阵map,其中的值只有0和1两种,求其中全是1 的所有矩形区域中,最大的矩形区域为1的数量。 例如: 1 1 1 0 逃离我推掉我的手/ 2022年01月05日 23:55/ 0 赞/ 132 阅读
还没有评论,来说两句吧...