美文网首页
4_9数组变树

4_9数组变树

作者: X_Y | 来源:发表于2017-09-12 16:24 被阅读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;
    }
};

相关文章

  • 4_9数组变树

    对于一个没有重复元素的整数数组,请用其中元素构造一棵MaxTree,MaxTree定义为一棵二叉树,其中的节点与数...

  • reduce解决一维转二维,三维数组

    1一维数组变二维数组: 2 一维数组变三维数组: 思路: prev 初始都是一个空数组[ ] ,然后根据索引来操作...

  • 泛型 - 通配符

    使用通配符的原因:Java中的数组是协变的,但是泛型不支持协变。 数组的协变 首先了解下什么是数组的协变,看下面的...

  • 变树

    我在朦朦的雾里向前走 踮着脚,一步又一步 悠远的声音传来,又散开 周围极近的地方,有琐碎的声响 掩着我的声息,是天...

  • 双数组树学习

    双数组树 1、概述 1、双数组树是一种搜索树,是Trie结构的压缩形式,使用两个一维数组BASE和CHECK来表示...

  • 字符串、解构赋值

    字符串 解构赋值 数组的结构赋值 对象的解构赋值 伪数组变真数组方法

  • 目录

    数组 动态数组 链表 栈 队列 优先队列 树 二叉树(广义)二叉堆二叉查找树AVL树 并查集 散列表

  • 十三. java数据结构 - 顺序存储二叉树

    1.基本说明 从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组,看示...

  • vuejs-elementUI-treeTable

    1、树与数组转换对应的目录如下图所示: 1、树与数组转换 /* * @Author: zhr */ import...

  • 数据结构动画描述

    数组 插入数组插入 删除数组删除 链表 栈 队列 二分搜索树 插入

网友评论

      本文标题:4_9数组变树

      本文链接:https://www.haomeiwen.com/subject/vqgcsxtx.html