对于一个没有重复元素的整数数组,请用其中元素构造一棵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
vector<int> leftMax(n);
vector<int> rightMax(n);
vector<int> res;
stack<int>left,right;
for(int i = 0;i<n;++i){
while(!left.empty()&&A[left.top()]<A[i])
left.pop();
if(left.empty())
leftMax[i] = -1;
else
leftMax[i] = left.top();
left.push(i);
}
for(int i = n-1;i>=0;--i){
while(!right.empty()&&A[right.top()]<A[i])
right.pop();
if(right.empty())
rightMax[i] = -1;
else
rightMax[i] = right.top();
right.push(i);
}
for(int i = 0;i<n;++i){
if(leftMax[i] == -1&&rightMax[i] == -1)
res.push_back(-1);
else if(leftMax[i] == -1)
res.push_back(rightMax[i]);
else if(rightMax[i] == -1)
res.push_back(leftMax[i]);
else if(A[leftMax[i]]<A[rightMax[i]])
res.push_back(leftMax[i]);
else
res.push_back(rightMax[i]);
}
return res;
}
};