您的位置:首页 > 其它

数组变树练习题

2016-03-18 18:28 218 查看
传送门:http://www.nowcoder.com/courses/1/4/9 购买视频请输入优惠码  AdVHxHT 可优惠10元

题目描述 

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

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

测试样例:
[3,1,4,2],4

返回:[2,0,-1,2]

AC 代码
class MaxTree {
public:
vector<int> buildMaxTree(vector<int> arr, int n) {
vector<int> leftMax(n),rightMin(n);
stack<int> s;
for (int i=0; i<n; i++) {
while (!s.empty()&&arr[s.top()]<=arr[i]) {
s.pop();
}
if(s.empty())
leftMax[i] = -1;
else
leftMax[i] = s.top();
s.push(i);
}
while (!s.empty())
s.pop();
for (int i=n-1; i>=0; --i) {
while (!s.empty()&&arr[s.top()]<=arr[i]) {
s.pop();
}
if(s.empty())
rightMin[i] = -1;
else
rightMin[i] = s.top();
s.push(i);
}
for (int i=0; i<n; ++i) {
if(rightMin[i]==-1)
continue;
if(leftMax[i]==-1&&rightMin[i]!=-1)
leftMax[i] = rightMin[i];
else{
if(arr[leftMax[i]]>arr[rightMin[i]])
leftMax[i
4000
] = rightMin[i];
}
}
return leftMax;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: