4_9数组变树

对于一个没有重复元素的整数数组,请用其中元素构造一棵MaxTree,MaxTree定义为一棵二叉树,其中的节点与数组元素一一对应,同时对于MaxTree的每棵子树,它的根的元素值为子树的最大值。现有一建树方法,对于数组中的每个元素,其在树中的父亲为数组中它左边比它大的第一个数和右边比它大的第一个数中更小的一个。若两边都不存在比它大的数,那么它就是树根。请设计O(n)的算法实现这个方法。

给定一个无重复元素的数组A和它的大小n,请返回一个数组,其中每个元素为原数组中对应位置元素在树中的父亲节点的编号,若为根则值为-1。

测试样例:
输入:[3,1,4,2],4
返回:[2,0,-1,2]

class MaxTree {
public:
    vector<int> buildMaxTree(vector<int> A, int n) {
        // write code here
        // 利用stack存储局部最值
        stack<int> stk_l;
        vector<int> left(n);
        vector<int> right(n);
        // 找左边
        for(int i=0; i<n; i++){
            while(!stk_l.empty() && A[i] > A[stk_l.top()]){
                stk_l.pop();
            }
            if(stk_l.empty()){
                left[i] = -1;
            }else{
                left[i] = stk_l.top();
            }
            stk_l.push(i);
        }
        // 找右边
        stack<int> stk_r;
        for(int i=n-1; i>=0; i--){
            while(!stk_r.empty() && A[i] > A[stk_r.top()]){
                stk_r.pop();
            }
            if(stk_r.empty()){
                right[i] = -1;
            }else{
                right[i] = stk_r.top();
            }
            stk_r.push(i);
        }
        // 合并
        vector<int> result(n);
        for(int i=0; i<n; i++){
            if(-1 == left[i]){
                if(-1 == right[i]){
                    result[i] = -1;
                }else{
                    result[i] = right[i];
                }
            }else{
                if(-1 == right[i]){
                    result[i] = left[i];
                }else{
                    result[i] = A[left[i]] < A[right[i]] ? left[i] : right[i];
                }
            }
        }
        return result;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 14,596评论 0 25
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 10,639评论 0 12
  • 第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章...
    SeanCheney阅读 11,125评论 0 19
  • 昨天晚上习惯性的点开微信关注的情感公众号,看到一篇文章《若是我问心有愧呢》,顿时我就被这个标题吸引了。进去是一幅长...
    蒽北城以北阅读 3,638评论 10 3
  • 外号的来历 多媒体出示曹文轩《草房子》第一章第一节第二段第一句话: 秃鹤应该叫陆鹤,但因为他是一个十足的小秃子,油...
    飞鸿影2017阅读 4,112评论 0 0

友情链接更多精彩内容